#include <iostream>
using namespace std;
struct A { // Class to trace what happens with attributes of the derived class
A( ) { cout << " Create attribute class" << endl; }
~A( ) { cout << " Destroy attribute class" << endl; }
} ;
class X { // Base class
public :
X( ) { cout << " Create base class" << endl; }
virtual void test( ) { cout << " Test base class" << endl; }
~X( ) { cout << " Destroy base class" << endl; } // oops
} ;
class XX : public X { // Derived class
A a;
public :
XX( ) { cout << " Create derived class" << endl; }
void test( ) override { cout << " Test derived class" << endl; }
~XX( ) { cout << " Destroy derived class" << endl; }
} ;
void kill_it ( X* t) {
t- > test( ) ;
delete t;
}
int main( ) {
X * poly;
cout << "1) Test with base class:" << endl;
poly = new X( ) ;
kill_it ( poly) ;
cout << endl<< "2) Test with derived class" << endl;
poly = new XX( ) ;
kill_it ( poly) ;
cout << endl<< "3) How it should be with derived class" << endl;
{
XX dummy_destroyed_when_leaving_the_block;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEgeyAgICAgICAJCS8vIENsYXNzIHRvIHRyYWNlIHdoYXQgaGFwcGVucyB3aXRoIGF0dHJpYnV0ZXMgb2YgdGhlIGRlcml2ZWQgY2xhc3MgCglBKCkgeyBjb3V0PDwiICAgIENyZWF0ZSBhdHRyaWJ1dGUgY2xhc3MiPDxlbmRsOyB9Cgl+QSgpIHsgY291dDw8IiAgICBEZXN0cm95IGF0dHJpYnV0ZSBjbGFzcyI8PGVuZGw7IH0gCn07CmNsYXNzIFggewkJCQkvLyBCYXNlIGNsYXNzIApwdWJsaWM6IAoJWCgpIHsgY291dDw8IiAgQ3JlYXRlIGJhc2UgY2xhc3MiPDxlbmRsOyB9Cgl2aXJ0dWFsIHZvaWQgdGVzdCgpIHsgY291dDw8IiAgVGVzdCBiYXNlIGNsYXNzIjw8ZW5kbDsgfQoJflgoKSB7IGNvdXQ8PCIgIERlc3Ryb3kgYmFzZSBjbGFzcyI8PGVuZGw7IH0gLy8gb29wcyAKfTsKY2xhc3MgWFggOiBwdWJsaWMgWCB7CS8vIERlcml2ZWQgY2xhc3MKCUEgYTsgCnB1YmxpYzoKCVhYKCkgeyBjb3V0PDwiICBDcmVhdGUgZGVyaXZlZCBjbGFzcyI8PGVuZGw7IH0KCXZvaWQgdGVzdCgpIG92ZXJyaWRlIHsgY291dDw8IiAgVGVzdCBkZXJpdmVkIGNsYXNzIjw8ZW5kbDsgfQoJflhYKCkgeyBjb3V0PDwiICBEZXN0cm95IGRlcml2ZWQgY2xhc3MiPDxlbmRsOyB9ICAKfTsKCnZvaWQga2lsbF9pdCAoWCogdCkgewoJdC0+dGVzdCgpOyAKCWRlbGV0ZSB0Owp9CgppbnQgbWFpbigpIHsKCVggKnBvbHk7IAoJCgljb3V0PDwiMSkgVGVzdCB3aXRoIGJhc2UgY2xhc3M6Ijw8ZW5kbDsKCXBvbHkgPSBuZXcgWCgpOyAKCWtpbGxfaXQgKHBvbHkpOwoJCgljb3V0PDxlbmRsPDwiMikgVGVzdCB3aXRoIGRlcml2ZWQgY2xhc3MiPDxlbmRsOwoJcG9seSA9IG5ldyBYWCgpOyAKCWtpbGxfaXQgKHBvbHkpOwoJCgljb3V0PDxlbmRsPDwiMykgSG93IGl0IHNob3VsZCBiZSB3aXRoIGRlcml2ZWQgY2xhc3MiPDxlbmRsOwoJewoJCVhYIGR1bW15X2Rlc3Ryb3llZF93aGVuX2xlYXZpbmdfdGhlX2Jsb2NrOwoJfQp9