测试平台,Ubuntu 12.04--x64 代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
class A {
public:
long a;
virtual void a1() { cout << "A:a1()" << endl; }
virtual void a2() { cout << "A:a2()" << endl; }
};
class B: public virtual A {
public:
long b;
virtual void B1() { cout << "B:b1()" << endl; }
virtual void a2() { cout << "B:a2()" << endl; }
};
class C: public virtual A {
public:
long c;
virtual void C1() { cout << "C:C1()" << endl; }
virtual void C2() { cout << "C:C2()" << endl; }
};
class D: public B, public C {
public:
long d;
virtual void D1() { cout << "D:D1()" << endl; }
virtual void C2() { cout << "D:C2()" << endl; }
};
typedef void(*Fun)();
int main()
{
D d;
cout << "d addr:" << &d << endl;
B *pb = &d;
cout << "d(b) addr:" << pb << endl;
C *pc = &d;
cout << "d(c) addr:" << pc << endl;
A *pa = &d;
cout << "d(a) addr:" << pa << endl;
cout << "d:" << &d.d << endl
<< "c:" << &d.c << endl
<< "b:" << &d.b << endl
<< "a:" << &d.a << endl
<< "sizeof(d" << sizeof(D) << endl;
long *pint;
pint = (long*)*(long**)&d;
cout << "d addr:" << pint << endl << pint[-1] << endl << pint[-2] << endl << pint[-3] << endl;
cout << "function" << endl;
Fun pFunc;
pFunc = (Fun)*((long*)*(long*)(&d));
pFunc();
pFunc = (Fun)*((long*)*(long*)(&d)+1);
pFunc();
pFunc = (Fun)*((long*)*(long*)(&d)+2);
pFunc();
pFunc = (Fun)*((long*)*(long*)(&d)+3);
pFunc();
pint = (long*)*(long**)pc;
cout << "c addr:" << pint << endl << pint[-1] << endl << pint[-2] << endl << pint[-3] << endl;
pFunc = (Fun)(pint[0]);
pFunc();
pFunc = (Fun)(pint[1]);
pFunc();
pint = (long*)*(long**)pa;
cout << "a addr:" << pint << endl << pint[-1] << endl << pint[-2] << endl << pint[-3] << endl;
pFunc = (Fun)(pint[0]);
pFunc();
pFunc = (Fun)(pint[1]);
pFunc();
return 0;
}