// { dg-do run } extern "C" int printf(const char *, ...); class A_table { int c; public: A_table() { c = 3;} virtual void func2(int &item) { printf("func2(%d,) c=%d\n",item,c);} }; class B_table : private A_table { public: typedef void (B_table::* B_ti_fn) (int &item); B_table() { j = 0x4321;} virtual void call_fn_fn1(int &item, void *pfn1); void func1(int &item) { printf("func1(%d)\n",item);} virtual void func2(int &item) { printf("func2(%d) j=%d\n",item,j);} int j; }; class foo : public A_table { public: int i; virtual ~foo(); virtual void func2(int &item) { printf("func2(%d) i=%d\n",item,i);} }; foo::~foo() { i = 0;} class bar :public foo,public B_table { public: int w; virtual ~bar(); virtual void func2(int &item) { printf("func2(%d) w=%d\n",item,w);} }; bar::~bar() { w = 0;} void B_table::call_fn_fn1(int &item, void *pfn1) { (this->*(*(B_ti_fn*)pfn1))(item); } B_table b; bar jar; int main() { printf("ptr to B_table=%x, ptr to A_table=%x\n",&b,(A_table*)&b); B_table::B_ti_fn z = &B_table::func1; int j = 1; jar.call_fn_fn1(j,(void *)&z); j++; z = &B_table::func2; b.call_fn_fn1(j,(void *)&z); j++; jar.call_fn_fn1(j,(void *)&z); return 0; }