C++ 菱形继承

来源:互联网 发布:易支付源码 编辑:程序博客网 时间:2024/05/29 03:18

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;}
原创粉丝点击