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