开发者社区> CtrlX> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C++继承中的多继承语法与菱形继承

简介: 多继承语法 C++允许一个类继承多个类 语法:class 子类 :继承方式 父类1 , 继承方式 父类2... 多继承可能会引发父类中有同名成员出现,需要加作用域区分 C++实际开发中不建议用多继承
+关注继续查看



多继承语法

C++允许一个类继承多个类

语法:class 子类 :继承方式 父类1 , 继承方式 父类2...

多继承可能会引发父类中有同名成员出现,需要加作用域区分

C++实际开发中不建议用多继承

示例:

class Base1 {

public:

    Base1()

    {

        m_A = 100;

    }

public:

    int m_A;

};

class Base2 {

public:

    Base2()

    {

        m_A = 200;  //开始是m_B 不会出问题,但是改为mA就会出现不明确

    }

public:

    int m_A;

};

//语法:class 子类:继承方式 父类1 ,继承方式 父类2

class Son : public Base2, public Base1

{

public:

    Son()

    {

        m_C = 300;

        m_D = 400;

    }

public:

    int m_C;

    int m_D;

};

//多继承容易产生成员同名的情况

//通过使用类名作用域可以区分调用哪一个基类的成员

void test01()

{

    Son s;

    cout << "sizeof Son = " << sizeof(s) << endl;

    cout << s.Base1::m_A << endl;

    cout << s.Base2::m_A << endl;

}

int main() {

    test01();

    system("pause");

    return 0;

}

总结: 多继承中如果父类中出现了同名情况,子类使用时候要加作用域

菱形继承

菱形继承概念:

两个派生类继承同一个基类

又有某个类同时继承者两个派生类

这种继承被称为菱形继承,或者钻石继承


菱形继承问题:

  1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
  2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。

示例:

class Animal

{

public:

    int m_Age;

};

//继承前加virtual关键字后,变为虚继承

//此时公共的父类Animal称为虚基类

class Sheep : virtual public Animal {};

class Tuo   : virtual public Animal {};

class SheepTuo : public Sheep, public Tuo {};

void test01()

{

    SheepTuo st;

    st.Sheep::m_Age = 100;

    st.Tuo::m_Age = 200;

    cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;

    cout << "st.Tuo::m_Age = " <<  st.Tuo::m_Age << endl;

    cout << "st.m_Age = " << st.m_Age << endl;

}

int main() {

    test01();

    system("pause");

    return 0;

}

vbptr全称:virtual base pointer虚基类指针,指向vbtable ,virtual base table 虚基类列表。

1.jpg

使用了虚继承后对比未使用虚继承解决菱形继承

2.jpg

总结:

  • 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
  • 利用虚继承可以解决菱形继承问题


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C# 继承和多态
继承 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。 当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。
29 0
C#继承
关于继承--和子承父业一样一样滴,----你继承了谁谁的东西也归你所有了   using System; using System.Collections.Generic; using System.
541 0
C++继承一之公有继承
一般来说一个类可以继承于另外一个类,分别叫做派生类和基类, 派生类继承了基类的公有成员和保护成员以及实现,而私有成员只能通过 基类的公有方法进行访问 派生类应该包含如下信息: 1、继承类构造函数 2、需要额外增加的成员以及实现 我们引用C++ primer...
679 0
chk cloud
  应用程序通过socket系统调用和远程主机进行通讯,每一个socket都有一个读写缓冲区。读缓冲区保存了远程主机发送过来的数据,如果缓冲区已满,则数据会被丢弃,写缓冲期保存了要发送到远程主机的数据,如果写缓冲区已慢,则系统的应用程序在写入数据时会阻塞。
644 0
C# 继承
在继承一个基类时,成员(属性、方法)的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。 只有派生类才能访问基类的protected成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。 基类的成员可以是虚拟(Virtual)的,也就是说,成员可以由继承它的类重写。派生类可以提供成员的其他实现
935 0
C# 继承
在继承一个基类时,成员(属性、方法)的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。 只有派生类才能访问基类的protected成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。 基类的成员可以是虚拟(Virtual)的,也就是说,成员可以由继承它的类重写。派生类可以提供成员的其他实现
699 0
+关注
CtrlX
【个人网站】ctrlx.life 【联系方式】微信:gitctrlx 【软件技能】前端,C++,Python,研究网络工程,数据结构与算法。
31
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载