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

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



多继承语法

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

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

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

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

示例:

classBase1 {

public:

   Base1()

   {

       m_A=100;

   }

public:

   intm_A;

};

classBase2 {

public:

   Base2()

   {

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

   }

public:

   intm_A;

};

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

classSon : publicBase2, publicBase1

{

public:

   Son()

   {

       m_C=300;

       m_D=400;

   }

public:

   intm_C;

   intm_D;

};

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

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

voidtest01()

{

   Sons;

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

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

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

}

intmain() {

   test01();

   system("pause");

   return0;

}

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

菱形继承

菱形继承概念:

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

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

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


菱形继承问题:

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

示例:

classAnimal

{

public:

   intm_Age;

};

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

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

classSheep : virtualpublicAnimal {};

classTuo   : virtualpublicAnimal {};

classSheepTuo : publicSheep, publicTuo {};

voidtest01()

{

   SheepTuost;

   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;

}

intmain() {

   test01();

   system("pause");

   return0;

}

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

1.jpg

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

2.jpg

总结:

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


目录
相关文章
|
20天前
|
C++
8. C++继承
8. C++继承
22 0
|
20天前
|
安全 Java 编译器
C++:继承
C++:继承
29 0
|
23天前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生
|
26天前
|
编译器 C++
深入理解 C++ 语法:从基础知识到高级应用
了解C++基础语法,包括`#include &lt;iostream&gt;`引入输入输出库,`using namespace std`简化命名。`int main()`是程序入口,`cout &lt;&lt; &quot;Hello World!&quot;`用于输出文本。换行可使用`\n`或`endl`。注释使用`//`进行单行注释,`/* */`进行多行注释。
26 0
|
23天前
|
安全 编译器 程序员
C++中的继承
C++中的继承
20 2
|
27天前
|
算法 编译器 程序员
【C++ 泛型编程 入门篇】全面掌握C++元模板中的模板继承:模板继承深入指南和教程
【C++ 泛型编程 入门篇】全面掌握C++元模板中的模板继承:模板继承深入指南和教程
34 0
|
20天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
20天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0
|
1天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
1天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载

热门文章

最新文章