56 lines
1.2 KiB
C
56 lines
1.2 KiB
C
// { 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;
|
|
}
|