#include <iostream>
using namespace std;
class TestClass{
protected:
int num;
public:
TestClass(int n):num(n){
cout<<this<<" : init of : " <<this->num<<endl;
}
TestClass(const TestClass& t):num(t.num){
cout<<this<<" : copyInit of : " <<this->num<<endl;
}
virtual void printNum () const { cout << "NUM: " << num << endl; }
};
class TestClassDerived : public TestClass {
public:
TestClassDerived(int n):TestClass(n){}
virtual void printNum () const { cout << "DERIVED NUM: " << num << endl; }
};
int main(int argc, const char * argv[]){
const TestClass t1 = TestClass(100); //option1
TestClassDerived td2(100);
const TestClass &t2 = TestClassDerived(100); //option2
t1.printNum();
t2.printNum();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVGVzdENsYXNzewpwcm90ZWN0ZWQ6CiAgICBpbnQgbnVtOwpwdWJsaWM6CiAgICBUZXN0Q2xhc3MoaW50IG4pOm51bShuKXsKICAgICAgICBjb3V0PDx0aGlzPDwiIDogaW5pdCBvZiA6ICIgPDx0aGlzLT5udW08PGVuZGw7CiAgICB9CiAgICBUZXN0Q2xhc3MoY29uc3QgVGVzdENsYXNzJiB0KTpudW0odC5udW0pewogICAgICAgIGNvdXQ8PHRoaXM8PCIgOiBjb3B5SW5pdCBvZiA6ICIgPDx0aGlzLT5udW08PGVuZGw7CiAgICB9CiAgICB2aXJ0dWFsIHZvaWQgcHJpbnROdW0gKCkgY29uc3QgeyBjb3V0IDw8ICJOVU06ICIgPDwgbnVtIDw8IGVuZGw7IH0KfTsKCmNsYXNzIFRlc3RDbGFzc0Rlcml2ZWQgOiBwdWJsaWMgVGVzdENsYXNzIHsKcHVibGljOgogICAgVGVzdENsYXNzRGVyaXZlZChpbnQgbik6VGVzdENsYXNzKG4pe30KICAgIHZpcnR1YWwgdm9pZCBwcmludE51bSAoKSBjb25zdCB7IGNvdXQgPDwgIkRFUklWRUQgTlVNOiAiIDw8IG51bSA8PCBlbmRsOyB9Cn07CgoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pewogICAgY29uc3QgVGVzdENsYXNzIHQxID0gVGVzdENsYXNzKDEwMCk7IC8vb3B0aW9uMQogICAgVGVzdENsYXNzRGVyaXZlZCB0ZDIoMTAwKTsKICAgIGNvbnN0IFRlc3RDbGFzcyAmdDIgPSBUZXN0Q2xhc3NEZXJpdmVkKDEwMCk7IC8vb3B0aW9uMgogICAgdDEucHJpbnROdW0oKTsKICAgIHQyLnByaW50TnVtKCk7Cn0=