1.在多重继承中,基类的构造顺序与派生类列表中基类的出现顺序保持一致,与初始值列表中的顺序无关。

2.在C++11新标准中,允许派生类从它的一个或几个基类中继承构造函数。但是如果从多个基类中继承了相同的构造函数(即形参列表完全相同)则程序将产生错误。这个时候这个类必须为该构造函数定义自己的版本。

class base
{
public:
base(int);
}; class base1
{
public:
base1(int);
}; class test :public base, public base1
{
public:
using base::base; // 从base继承构造函数
using base1::base1; // 从base1继承构造函数,此时已经报错 test(int); // 正确,上面的错误也消失
};

3.和往常一样,派生类的析构函数只负责清除派生类本身分配的资源,派生类的成员及基类都是自动销毁的。合成的析构函数体为空,析构函数的调用顺序正好与构造函数相反。

4.与只有一个基类的继承一样,多重继承的派生类如果定义了自己的拷贝/赋值构造函数和赋值运算符,则必须在完整的对象上执行拷贝,移动或赋值操作。只有当派生类使用的是合成版本的拷贝,移动或赋值成员时,才会自动对其基类部分执行这些操作,每个基类分别使用自己的对应成员隐式地完成构造,赋值或销毁等工作。

5.派生类对象可以转换到任意一种基类,但是对于重载函数可能产生二义性错误。

class base
{
}; class base1
{
}; class test :public base, public base1
{
}; void print(const base &b);
void print(const base1 &b); test t;
print(t); // 二义性错误

6.在多重继承中,对于名字的查找过程在所有直接基类中同时进行。如果名字在多个基类中都被找到,则对该名字的使用将具有二义性。这时候我们需要加上前缀限定符,或者在派生类中重新定义这个名字。

7.在默认情况下。派生类中含有继承链上每个类对应的子部分,如果某个类在派生过程中出现了多次,则派生类中将包含该类的多个子对象。我们可以通过虚继承解决这个问题,共享的基类子对象称为虚基类。虚派生只影响从指定了虚基类的派生类中进一步派生出的类,它不会影响派生类本身。虚派生中,虚基类是由最低层的派生类初始化的。

class base
{
}; class base1 :public virtual base
{
}; class base2 :virtual public base // virtual和public的顺序随意
{
}; class test :public base1, public base2 // test中只有一个base子对象
{
public:
test() :base() {} // 最低层的派生类可以直接初始化共享基类
};

8.含有虚基类的对象的构造顺序与一般的顺序稍有区别:首先使用提供给最低层派生类构造函数的初始值初始化该对象的虚基类子部分,接下来按照直接基类在派生列表中出现的次序对其进行初始化。

9.一个类可以有多个虚基类,此时,这些虚的子对象按照它们在派生列表中出现的顺序从左向右依次构造。合成的拷贝和移动构造函数按照完全相同的顺序执行,合成的赋值运算符中的成员也按照该顺序赋值。销毁顺序和构造顺序相反。

C++ Primer 笔记——多重继承与虚继承的更多相关文章

  1. C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承

    用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...

  2. C++ Primer 有感(多重继承与虚继承)

    1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响.2.在单 ...

  3. C++中的多重继承与虚继承的问题

    1.C++支持多重继承,但是一般情况下,建议使用单一继承. 类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况: A          A \          / B     C ...

  4. 多重继承,虚继承,MI继承中虚继承中构造函数的调用情况

    先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include < ...

  5. 【c++】多重继承与虚继承

    派生类的构造函数初始化列表将实参分别传递给每个直接基类,其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始化列表中基类的顺序无关. 类型转换与多个基类 编译器不会在派生类向基 ...

  6. C++学习之多重继承与虚继承

    一.多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分.同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义 ...

  7. C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题

    #include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...

  8. Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

    前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...

  9. C++虚继承作用

    C++虚继承可以防止多重继承产生的二义性问题. 虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类.虚继承在多重继承的时可以防止二义性. clas ...

随机推荐

  1. 20165234 《Java程序设计》第二周学习总结

    第二周学习总结 教材学习内容总结 第二章 标识符与关键字 1.标识符 其本质是文件名字. 由字母.下画线.美元符号和数字组成,长度不受限制. 标识符的第一个字符不能为数字,标识符不能为关键字(如int ...

  2. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  3. 【ARTS】01_14_左耳听风-20190211~20190217

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. 很清晰的解读i2c协议【转】

    转自:https://blog.csdn.net/weixin_41718085/article/details/79376823 转载:http://dpinglee.blog.163.com/bl ...

  5. 题解-bzoj4221 JOI2012kangaroo

    Problem bzoj 题意:给定\(n\)只袋鼠,每只袋鼠有俩属性\(a,b\),若\(a_i\leq b_j\),则\(i\)是可以被\(j\)放置在袋子里的,求经过一系列放置操作后无法进行操作 ...

  6. EF 常见异常总结

    问题:System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invoca ...

  7. SharePoint 2013 报错 异常来自 HRESULT:0X80131904

    直接上传文件,报错:该Url xxxx无效.它可能指向不存在的文件或文件夹,或者是执行不再当前网站中的有效文件或文件夹. 直接新建文件夹,报错:异常来自 HRESULT:0X80131904 以系统账 ...

  8. TX2 开发套件串口

    TX2的底板上有三个串口,位于J21的ttyTHS1,位于J17的ttyTHS2和给蓝牙使用的ttyTHS3. ttyTHS1是控制台串口(serial console),再启动的时候会通过它打印一系 ...

  9. 解决由腾讯qq浏览器引起win10系统桌面图标不停的闪烁问题

    win10系统桌面图标不停的闪烁,虽然不会引起太大问题,但是看着实在郁闷在网上搜索了很久,像停止问题报告服务,重置为默认应用都无解,了解到大概是软件兼容性问题于是打开服务管理器,一个一个关闭不是微软的 ...

  10. elasticsearch5.0.1集群排错的几个思路总结

    1.首先查看集群整体健康状态 # curl -XGET http://10.27.35.94:9200/_cluster/health?pretty { "cluster_name" ...