#include<iostream> #include<algorithm> #include<string> using namespace std; class Base { public: int funptr; void (Base::*Show)(); Base(){Show=&Base::Display;} ~Base(){}; void Display() { typedef void (*Function)(const Base *bse); Function fun=(Function)(this->funptr); fun(this); } }; class Widget:public Base { string name; typedef void (Widget::*Function)() const; public: Widget() { std::cout<<"unknow constructed"<<endl; Function fun=&Widget::Display; funptr=*(reinterpret_cast<int*>(&fun)); } //Show=&Widget::Display; ~Widget(){std::cout<<name<<" destructed"<<endl;} Widget(string str):name(str) { std::cout<<str<<" constructed"<<endl; Function fun=&Widget::Display; funptr=*(reinterpret_cast<int*>(&fun)); }//Show=&Widget::Display; void Display() const { cout<<name<<" Widget function"<<endl; } }; class Derived:public Base { string name; typedef void (Derived::*Function)() const; public: Derived() { std::cout<<"unknow constructed"<<endl; Function fun=&Derived::Display; funptr=*(reinterpret_cast<int*>(&fun)); } //Show=&Widget::Display; ~Derived(){std::cout<<name<<" destructed"<<endl;} Derived(string str):name(str) { std::cout<<str<<" constructed"<<endl; Function fun=&Derived::Display; funptr=*(reinterpret_cast<int*>(&fun)); }//Show=&Widget::Display; void Display() const { cout<<name<<" Derived function"<<endl; } }; int main() { typedef void (*Function)(Base *bse); Base *fuk=new Derived("Shadow"); Base *bse=new Widget("Hello"); bse->Display(); fuk->Display(); return 0; }