#include class Base { public: virtual void test(){printf("Base\n");} }; class Derived : public Base { public: virtual void test(){printf("Derived\n");} }; class BaseImp; typedef void (BaseImp::*FuncType)(); class BaseImp { static FuncType funcTableBase[1]; public: FuncType* pfunc; BaseImp(){pfunc = funcTableBase;} virtual void test(){printf("BaseImp\n");} }; FuncType BaseImp::funcTableBase[1] = {&BaseImp::test}; class DerivedImp : public BaseImp { static FuncType funcTableDerived[1]; public: DerivedImp(){pfunc = funcTableDerived;} virtual void test(){printf("DerivedImp\n");} }; FuncType DerivedImp::funcTableDerived[1] = {(FuncType)&DerivedImp::test}; void test1() { Base b; Derived d; Base* pb = &b; Base* pd = &d; pb->test(); pd->test(); } void test2() { BaseImp b; DerivedImp d; BaseImp* pb = &b; BaseImp* pd = &d; (pb->*(pb->pfunc[0]))(); // pb->test(); (pd->*(pd->pfunc[0]))(); // pd->test(); } int main(int argc,char** argv) { test1(); // 通常のプログラム test2(); // virtualを自分で実装 return 0; }