现在的位置: 首页 > 综合 > 正文

虚拟继承、多态的内存布局

2013年09月07日 ⁄ 综合 ⁄ 共 1426字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.