#include <iostream>
struct Base {
void *operator new( size_t size ) {
std::cout << "Base::operator new" << std::endl;
return ::operator new( size );
}
void operator delete( void *mem ) {
std::cout << "Base::operator delete" << std::endl;
::operator delete( mem );
}
virtual ~Base() { }
virtual Base *f() = 0;
};
struct Derived : Base {
virtual Derived *f() {
return new Derived;
};
};
int main()
{
Base *b = new Derived;
Base *d = b->f();
delete b;
delete d;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UgewogICAgdm9pZCAqb3BlcmF0b3IgbmV3KCBzaXplX3Qgc2l6ZSApIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2U6Om9wZXJhdG9yIG5ldyIgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyggc2l6ZSApOwogICAgfQogICAgdm9pZCBvcGVyYXRvciBkZWxldGUoIHZvaWQgKm1lbSApIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkJhc2U6Om9wZXJhdG9yIGRlbGV0ZSIgPDwgc3RkOjplbmRsOwogICAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKCBtZW0gKTsKICAgIH0KCiAgICB2aXJ0dWFsIH5CYXNlKCkgeyB9CiAgICB2aXJ0dWFsIEJhc2UgKmYoKSA9IDA7Cn07CgpzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgdmlydHVhbCBEZXJpdmVkICpmKCkgewogICAgICAgIHJldHVybiBuZXcgRGVyaXZlZDsKICAgIH07Cn07CgppbnQgbWFpbigpCnsKICAgIEJhc2UgKmIgPSBuZXcgRGVyaXZlZDsKICAgIEJhc2UgKmQgPSBiLT5mKCk7CiAgICBkZWxldGUgYjsKICAgIGRlbGV0ZSBkOwp9Cg==