#include <iostream>
using namespace std;
class B
{
public:
virtual void f() const { cout << "B\n"; }
virtual ~B() { cout << "~B\n"; }
};
class C: public B
{
public:
void f() const { cout << "C\n"; }
~C() { cout << "~C\n"; }
};
class D: public C
{
public:
void f() const { cout << "D\n"; }
~D() { cout << "~D\n"; }
};
int main()
{
B*b = new D;
b->f();
delete b;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZigpIGNvbnN0IHsgY291dCA8PCAiQlxuIjsgfQogICAgdmlydHVhbCB+QigpIHsgY291dCA8PCAifkJcbiI7IH0KfTsKCmNsYXNzIEM6IHB1YmxpYyBCCnsKcHVibGljOgogICAgdm9pZCBmKCkgY29uc3QgeyBjb3V0IDw8ICJDXG4iOyB9CiAgICB+QygpIHsgY291dCA8PCAifkNcbiI7IH0KfTsKCmNsYXNzIEQ6IHB1YmxpYyBDCnsKcHVibGljOgogICAgdm9pZCBmKCkgY29uc3QgeyBjb3V0IDw8ICJEXG4iOyB9CiAgICB+RCgpIHsgY291dCA8PCAifkRcbiI7IH0KfTsKCmludCBtYWluKCkKewogICAgQipiID0gbmV3IEQ7CiAgICBiLT5mKCk7CiAgICBkZWxldGUgYjsKfQo=