菱形虚拟继承

    最近在学习C++的继承,菱形继承是比较难懂的一部分,所以通过查阅资料后整理了一下思路,也和同学分享了关于菱形虚拟继承的一些东西。

    菱形继承在一般情况下使用不到的,但是通过了解菱形继承,我们 可以了解编译器是如何工作的。

    首先,菱形虚拟继承就是两个基类虚拟继承一个共同的超类,然后两个基类由有一个共同的派生类。

    

wKioL1bjlHujLuXsAAALr0cNA0k826.png

class Base
{
public:
    void func()
    {
        cout << "Base::func"<<endl;
    }
public:
    int a;
};

class Base1:virtual public Base
{
public :
    virtual void func1()
    {
        cout<<"Base1::func1" <<endl;
    }

    virtual void func2()
    {
        cout<<"Base1::func2" <<endl;
    }

public :
    int b1 ;
};

class Base2:virtual public Base
{
public :
    virtual void func1()
    {
        cout<<"Base2::func1" <<endl;
    }

    virtual void func2()
    {
        cout<<"Base2::func2" <<endl;
    }

public :
    int b2 ;
};


class Derive : public Base1, public Base2
{
public :
    virtual void func1()
    {
        cout<<"Derive::func1" <<endl;
    }

    virtual void func3()
    {
        cout<<"Derive::func3" <<endl;
    }

pubilc :
    int d1 ;
};

在这我们构造出一个Derive的对象d,调用监视窗口,看一下编译器是怎么存的。


wKiom1bjmfChUB_rAAA_pbwY8X8420.png

     我们可以看到,Base1和Base2中都有一个虚函数表指针,编译器就是利用虚函数表指针解决了二义性问题,而且Base1和Base2的虚函数表指针地址都不同,所以他们都有自己的虚表。

int main()
{
    //Test1();
    Derive d;
    d.a = 1;
    d.b1 = 2;
    d.b2 = 3;
    d.d1 = 4;

    return 0;
}

之前的类的数据成员我是设为了public的,方便赋值后直接调出内存来看内存里的变化。然后给数据成员a,b1,b2,d依次赋值然后调出内存看:

wKioL1bjriHR4X2ZAAA9VfsEPMM399.png

所以虚拟继承的实质就是利用一个虚基类指针和一个虚函数表指针解决数据的二义性

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值