#include <iostream>
#include <typeinfo>
using namespace std;
class BaseClass
{
public:
void foo() {
cout << "Before calling " << typeid(*this).name() << "::doFoo()" << endl;
doFoo();
cout << "After calling " << typeid(*this).name() << "::doFoo()" << endl;
}
protected:
virtual void doFoo() = 0;
};
class DerivedClass: public BaseClass
{
protected: // or private, depends on use case
virtual void doFoo() {/*come impl*/}
};
int main() {
BaseClass * bp = new DerivedClass();
bp->foo();
delete bp;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIGNsYXNzIEJhc2VDbGFzcwogICAgewogICAgcHVibGljOgogICAgICAgIHZvaWQgZm9vKCkgewogICAgICAgICAgICAgY291dCA8PCAiQmVmb3JlIGNhbGxpbmcgIiA8PCB0eXBlaWQoKnRoaXMpLm5hbWUoKSA8PCAiOjpkb0ZvbygpIiAgPDwgZW5kbDsgCiAgICAgICAgICAgICBkb0ZvbygpOyAKICAgICAgICAgICAgIGNvdXQgPDwgIkFmdGVyIGNhbGxpbmcgIiA8PCB0eXBlaWQoKnRoaXMpLm5hbWUoKSA8PCAiOjpkb0ZvbygpIiAgPDwgZW5kbDsgCiAgICAgICAgfQogICAgcHJvdGVjdGVkOgogICAgICAgIHZpcnR1YWwgdm9pZCBkb0ZvbygpID0gMDsKICAgIH07CgogICAgY2xhc3MgRGVyaXZlZENsYXNzOiBwdWJsaWMgQmFzZUNsYXNzCiAgICB7CiAgICBwcm90ZWN0ZWQ6IC8vIG9yIHByaXZhdGUsIGRlcGVuZHMgb24gdXNlIGNhc2UKICAgICAgICB2aXJ0dWFsIHZvaWQgZG9Gb28oKSB7Lypjb21lIGltcGwqL30KICAgIH07CiAgICAKaW50IG1haW4oKSB7CiAgICBCYXNlQ2xhc3MgKiBicCA9IG5ldyBEZXJpdmVkQ2xhc3MoKTsKICAgIGJwLT5mb28oKTsKICAgIGRlbGV0ZSBicDsKCXJldHVybiAwOwp9