#include <iostream>
using namespace std;
class B
{
public:
virtual void Test() {cout <<"B::Test"<<endl;}; // = 0; makes pure function call crash
void InDirect()
{
Test();
}
B(){ /*InDirect();*/ }
virtual ~B(){cout<<"~B"<<endl; InDirect();}
};
class BB : public B
{
public:
//void Test() override
//{ cout <<"BB::Test"<<endl; }
~BB(){cout<<"~BB"<<endl; InDirect();}
};
class BBB : public BB
{
public:
void Test() override
{ cout <<"BBB::Test"<<endl; }
~BBB(){cout<<"~BBB"<<endl;}
};
int main() {
B* ptr = new BBB;
delete ptr;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBCCnsKcHVibGljOgogIHZpcnR1YWwgdm9pZCBUZXN0KCkge2NvdXQgPDwiQjo6VGVzdCI8PGVuZGw7fTsgLy8gPSAwOyBtYWtlcyBwdXJlIGZ1bmN0aW9uIGNhbGwgY3Jhc2gKICB2b2lkIEluRGlyZWN0KCkKICB7CiAgCVRlc3QoKTsKICB9CiAgQigpeyAvKkluRGlyZWN0KCk7Ki8gfQogIHZpcnR1YWwgfkIoKXtjb3V0PDwifkIiPDxlbmRsOyBJbkRpcmVjdCgpO30KfTsKY2xhc3MgQkIgOiBwdWJsaWMgQgp7CnB1YmxpYzoKICAvL3ZvaWQgVGVzdCgpIG92ZXJyaWRlCiAgLy97IGNvdXQgPDwiQkI6OlRlc3QiPDxlbmRsOyB9CiAgfkJCKCl7Y291dDw8In5CQiI8PGVuZGw7IEluRGlyZWN0KCk7fQogIAp9OwpjbGFzcyBCQkIgOiBwdWJsaWMgQkIKewpwdWJsaWM6CiAgdm9pZCBUZXN0KCkgb3ZlcnJpZGUKICB7IGNvdXQgPDwiQkJCOjpUZXN0Ijw8ZW5kbDsgfQogIH5CQkIoKXtjb3V0PDwifkJCQiI8PGVuZGw7fQp9OwppbnQgbWFpbigpIHsKCUIqIHB0ciA9IG5ldyBCQkI7CglkZWxldGUgcHRyOwoJcmV0dXJuIDA7Cn0=