6.复杂的菱形继承及菱形虚拟继承
单继承:一个子类只有一个直接父类时称这个继承关系为单继承
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c42bf1024ab6856f71e4a3200d0451e4.png)
多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3872ebf0bfdf4a78d09826bc3495b729.png)
菱形继承:菱形继承是多继承的一种特殊情况。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/794808b047b1d502b0d81a79441aaa77.png)
菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。
class Person
{
public :
string _name ;
};
class Student : public Person
{
protected :
int _num ;
};
class Teacher : public Person
{
protected :
int _id ;
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ;
};
void Test ()
{
Assistant a ;
a._name = "peter";
a.Student::_name = "xxx";
a.Teacher::_name = "yyy";
}
虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person时使用虚拟继承,即可解决问题
class Person
{
public :
string _name ;
};
class Student : virtual public Person
{
protected :
int _num ;
};
class Teacher : virtual public Person
{
protected :
int _id ;
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ;
};
void Test ()
{
Assistant a ;
a._name = "peter";
}