#include < iostream > #include < vector > using namespace std;inline void print( char * msg) ... { cout << " " << msg << endl;} class A ... {public: virtual void foo1() ...{ print("A:foo1"); } void foo2() ...{ print("A:foo2"); }} ; class B: public A ... {public: void foo1() ...{ print("B:foo1"); } void foo2() ...{ print("B:foo2"); }} ; class Test ... {public: Test(char *msg, void (*fun)()) ...{ msg_ = msg; fun_ = fun; } void run() ...{ cout << msg_ << endl; fun_(); } char *msg_; void (*fun_)();} ; void test1() ... { A * a = new B(); B * b = (B*)a; b->foo1(); b->foo2(); a->foo1(); a->foo2(); delete a;} void test2() ... { B *b = new B(); b->foo1(); b->foo2(); A *a = b; a->foo1(); a->foo2(); delete b;} void test3() ... { B b; b.foo1(); b.foo2(); ((A)b).foo1(); ((A)b).foo2();} void test4() ... { B b; b.foo1(); b.foo2(); A *a = &b; a->foo1(); a->foo2();} void test5() ... { A a; B* b = (B*)&a; b->foo1(); b->foo2(); a.foo1(); a.foo2();} int main() ... { vector<Test *> tests; vector<Test *>::iterator t_iterator; tests.push_back(new Test("test1", &test1)); tests.push_back(new Test("test2", &test2)); tests.push_back(new Test("test3", &test3)); tests.push_back(new Test("test4", &test4)); tests.push_back(new Test("test5", &test5)); for (t_iterator=tests.begin(); t_iterator!=tests.end(); t_iterator++) ...{ (*t_iterator)->run(); } system("PAUSE");}