复杂的菱形继及菱形虚拟继承
单继承:一个子类只有一个直接父类时称这个继承关系为单继承
多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
菱形继承是多继承的一种特殊状态
菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在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; // 主修课程
};
int main()
{
// 这样会有二义性无法明确知道访问的是哪一个
Assistant a;
//a._name = "peter";//不指定访问哪个父类会报错
// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决。
//现在多一个似乎问题也不大,但如果person特别大呢?
a.Student::_name = "xxx";
a.Teacher::_name = "yyy";//这里会存在两个名