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;
}