#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;
}
