C++基本使用--菱形继承(多继承)

菱形继承/多继承

多继承

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
            
class A1 {        // 基类一
public:
    int m_a = 10;
};
       
class A2 {        // 基类二
public:
    int m_a = 20;
};
         
class B :public A1, public A2 {       // 派生类
public:
    int m_a = 30;
};
       
int main()
{
    B b;
    cout << " B::m_a的值是:" << b.m_a << endl;
    cout << "A1::m_a的值是:" << b.A1::m_a << endl;
    cout << "A2::m_a的值是:" << b.A2::m_a << endl;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

菱形继承

在这里插入图片描述

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

class A {    
public:
    int m_a = 10;
};

class B : public A { };

class C : public A { };

class DD : public B, public C {};

int main()
{
    DD d;
    d.B::m_a = 30;
    d.C::m_a = 80;
    cout << "B::m_a的地址是:" << &d.B::m_a << ",值是:" << d.B::m_a << endl;
    cout << "C::m_a的地址是:" << &d.C::m_a << ",值是:" << d.C::m_a << endl;
    cout << "B::A::m_a的地址是:" << &d.B::A::m_a << ",值是:" << d.B::A::m_a << endl;
    cout << "C::A::m_a的地址是:" << &d.C::A::m_a << ",值是:" << d.C::A::m_a << endl;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

虚继承virtual

为了解决多继承中的菱形继承的内存空间冗余和变量名称的二意性,使用虚继承的方法、

一份变量…

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

class A {    
public:
    int m_a = 10;
};

class B : virtual public A { };

class C : virtual public A { };

class DD : public B, public C {};

int main()
{
    DD d;
    d.B::m_a = 30;
    d.C::m_a = 80;
    cout << "B::m_a的地址是:" << &d.B::m_a << ",值是:" << d.B::m_a << endl;
    cout << "C::m_a的地址是:" << &d.C::m_a << ",值是:" << d.C::m_a << endl;
    cout << "B::A::m_a的地址是:" << &d.B::A::m_a << ",值是:" << d.B::A::m_a << endl;
    cout << "C::A::m_a的地址是:" << &d.C::A::m_a << ",值是:" << d.C::A::m_a << endl;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
vbptr是虚基类指针…

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值