#include <iostream>
using namespace std;
struct C;
struct B;
class A{
public:
A(int r): type(r){}
int type;
void deleter();
protected:
~A(){std::cout << "DTOR A" << std::endl;}
};
class B: public A{
public:
B():A(1){};
~B(){std::cout << "DTOR B" << std::endl;}
};
class C: public A{
public:
C():A(2){};
~C(){std::cout << "DTOR B" << std::endl;}
};
void A::deleter(){
if(type==1){
delete static_cast<B* const>(this);
}else if(type==2){
delete static_cast<C* const>(this);
}
}
int main(){
A * a = new B();
a->deleter();
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBDOwpzdHJ1Y3QgQjsKCmNsYXNzIEF7CiAgICBwdWJsaWM6CiAgICBBKGludCByKTogdHlwZShyKXt9CiAgICBpbnQgdHlwZTsKICAgIHZvaWQgZGVsZXRlcigpOwogICAgcHJvdGVjdGVkOgogICAgfkEoKXtzdGQ6OmNvdXQgPDwgIkRUT1IgQSIgPDwgc3RkOjplbmRsO30KfTsKCmNsYXNzIEI6IHB1YmxpYyBBewogICAgcHVibGljOgogICAgQigpOkEoMSl7fTsKICAgIH5CKCl7c3RkOjpjb3V0IDw8ICJEVE9SIEIiIDw8IHN0ZDo6ZW5kbDt9Cn07CgpjbGFzcyBDOiBwdWJsaWMgQXsKICAgIHB1YmxpYzoKICAgIEMoKTpBKDIpe307CiAgICB+Qygpe3N0ZDo6Y291dCA8PCAiRFRPUiBCIiA8PCBzdGQ6OmVuZGw7fQp9OwoKdm9pZCBBOjpkZWxldGVyKCl7CiAgICAgaWYodHlwZT09MSl7CiAgICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PEIqIGNvbnN0Pih0aGlzKTsKICAgIH1lbHNlIGlmKHR5cGU9PTIpewogICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDKiBjb25zdD4odGhpcyk7CiAgICB9Cn0KCmludCBtYWluKCl7CiAgICAgIEEgKiBhID0gbmV3IEIoKTsKICAgICAgYS0+ZGVsZXRlcigpOwp9