#include <iostream>
using namespace std;
struct A{
A(){cout<<"+A "<<this<<endl;}
~A(){cout<<"-A "<<this<<endl;}
virtual void test(){}
void ad(){
cout<<*(void**)this<<" "<<endl;
}
};
struct B:A{
B(){cout<<"+B "<<this<<endl;}
~B(){cout<<"-B "<<this<<endl;}
virtual void test(){}
};
void* operator new ( std::size_t count ){
void* r=malloc(count);
cout<<"new_1 "<<count<<" = "<<r<<endl;
return r;
}
void operator delete (void* r){
cout<<"delete_1 "<<" = "<<r<<endl;
free(r);
}
void operator delete (void* r, std::size_t count ){
cout<<"delete_2 "<<count<<" = "<<r<<endl;
free(r);
}
int main(){
cout<<sizeof(A)<<" "<<sizeof(B)<<endl<<endl;
{
B* b=new B;
A* a=b;
a->A::ad();
b->B::ad();
delete a;//Удаляю как a
}
cout<<endl<<endl;
{
B* b=new B;
A* a=b;
a->A::ad();
b->B::ad();
delete b;//Удаляю как b
}
cout<<endl<<endl;
{
B* b=new B;
A* a=b;
void* v=b;
a->A::ad();
b->B::ad();
delete v;//Удаляю как void*
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBBewogICBBKCl7Y291dDw8IitBICI8PHRoaXM8PGVuZGw7fQogICB+QSgpe2NvdXQ8PCItQSAiPDx0aGlzPDxlbmRsO30KICAgdmlydHVhbCB2b2lkIHRlc3QoKXt9CiAgIHZvaWQgYWQoKXsKICAgICAgY291dDw8Kih2b2lkKiopdGhpczw8IiAiPDxlbmRsOwogICB9Cn07CnN0cnVjdCBCOkF7CiAgIEIoKXtjb3V0PDwiK0IgIjw8dGhpczw8ZW5kbDt9CiAgIH5CKCl7Y291dDw8Ii1CICI8PHRoaXM8PGVuZGw7fQogICB2aXJ0dWFsIHZvaWQgdGVzdCgpe30KfTsKdm9pZCogb3BlcmF0b3IgbmV3ICAoIHN0ZDo6c2l6ZV90IGNvdW50ICl7CiAgIHZvaWQqIHI9bWFsbG9jKGNvdW50KTsKICAgY291dDw8Im5ld18xICI8PGNvdW50PDwiID0gIjw8cjw8ZW5kbDsKICAgcmV0dXJuIHI7Cn0Kdm9pZCBvcGVyYXRvciBkZWxldGUgICh2b2lkKiByKXsKICAgY291dDw8ImRlbGV0ZV8xICI8PCIgPSAiPDxyPDxlbmRsOwogICBmcmVlKHIpOwp9CnZvaWQgb3BlcmF0b3IgZGVsZXRlICAodm9pZCogciwgc3RkOjpzaXplX3QgY291bnQgKXsKICAgY291dDw8ImRlbGV0ZV8yICI8PGNvdW50PDwiID0gIjw8cjw8ZW5kbDsKICAgZnJlZShyKTsKfQoKaW50IG1haW4oKXsKICAgY291dDw8c2l6ZW9mKEEpPDwiICI8PHNpemVvZihCKTw8ZW5kbDw8ZW5kbDsKICAgewogICAgICBCKiBiPW5ldyBCOwogICAgICBBKiBhPWI7CiAgICAgIGEtPkE6OmFkKCk7CiAgICAgIGItPkI6OmFkKCk7CiAgICAgIGRlbGV0ZSBhOy8v0KPQtNCw0LvRj9GOINC60LDQuiBhCiAgIH0KICAgY291dDw8ZW5kbDw8ZW5kbDsKICAgewogICAgICBCKiBiPW5ldyBCOwogICAgICBBKiBhPWI7CiAgICAgIGEtPkE6OmFkKCk7CiAgICAgIGItPkI6OmFkKCk7CiAgICAgIGRlbGV0ZSBiOy8v0KPQtNCw0LvRj9GOINC60LDQuiBiCiAgIH0KICAgY291dDw8ZW5kbDw8ZW5kbDsKICAgewogICAgICBCKiBiPW5ldyBCOwogICAgICBBKiBhPWI7CiAgICAgIHZvaWQqIHY9YjsKICAgICAgYS0+QTo6YWQoKTsKICAgICAgYi0+Qjo6YWQoKTsKICAgICAgZGVsZXRlIHY7Ly/Qo9C00LDQu9GP0Y4g0LrQsNC6IHZvaWQqCiAgIH0KfQo=