C++ 菱形继承

1.菱形继承是什么


这里写图片描述


如上,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承。

这么做会引发什么问题呢,让我们来看一段代码

#include<iostream>
using namespace std;

class Person
{
public:
    string name;
};
class Student : public Person
{
protected:
    int age;
};
class Teacher : public Person
{
private:
    int num;
};
class Manger : public Student,public Teacher
{
public:
    string sex;
};
int main()
{
    Manger m;
    m.name;
    return 0;
}

这里写图片描述


由于Manger同时继承了Student和Teacher,而这个两个类同时继承了Person。这样就导致Manger对“name”的访问不明确。

那么我们可以怎样解决呢?

1⃣️ 第一种解决方法,使用域限定我们所需访问的函数

int main()
{
    Manger m;
    m.Student::name;
    m.Teacher::name;
    return 0;
}

这样的做法是没有问题的,但是,这样做非常的不方便,并且当程序十分大的时候会造成我们思维混乱

于是,C++给了我们一个别的解决方案——虚继承

2.虚继承


虚继承是什么?

虚继承即让A和B在继承Base时加上virtural关键字,这里需要记住不是D使用虚继承


这里写图片描述


我们可看见在student和teacher中不再保存person中的内容,保存了一份偏移地址,然后将person的数据保存在一个公共位置处这样保证了数据冗余性的降低同时,我们也能直接的使用m.name来访问person里的name。

#include<iostream>
using namespace std;

class Preson
{
public:
    string name;
};
class Student :virtual public Preson
{
protected:
    int age;
};
class Teacher :virtual public Preson
{
private:
    int num;
};
class Manger : public Student,public Teacher
{
public:
    string sex;
};
int main()
{
    Manger m;
    m.name;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值