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

本文详细探讨了C++中的虚拟继承和多态特性对内存布局的影响。通过Ubuntu 12.04 x64平台上的代码实例,展示了如何在实践中理解和分析这种内存组织方式,对于深入理解C++的内存管理和面向对象设计至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值