测试平台,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; }