菱形继承及菱形虚拟继承

本文详细探讨了C++中的菱形继承及其问题,包括数据冗余和二义性。通过示例展示了非虚拟继承导致的问题,并介绍了虚拟继承的概念,如何通过虚拟继承解决数据冗余。同时,讨论了虚基类、虚基表指针以及它们在内存布局中的作用。文章强调了尽量避免使用多继承和菱形继承以降低复杂性和提高性能,并提倡优先使用对象组合来实现代码复用。
摘要由CSDN通过智能技术生成

复杂的菱形继及菱形虚拟继承

单继承:一个子类只有一个直接父类时称这个继承关系为单继承

多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承

菱形继承是多继承的一种特殊状态

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在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";//这里会存在两个名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值