1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
// { 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;
}
|