C++ Primer 笔记——多重继承与虚继承
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 笔记——多重继承与虚继承的更多相关文章
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- C++ Primer 有感(多重继承与虚继承)
1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响.2.在单 ...
- C++中的多重继承与虚继承的问题
1.C++支持多重继承,但是一般情况下,建议使用单一继承. 类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况: A A \ / B C ...
- 多重继承,虚继承,MI继承中虚继承中构造函数的调用情况
先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include < ...
- 【c++】多重继承与虚继承
派生类的构造函数初始化列表将实参分别传递给每个直接基类,其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始化列表中基类的顺序无关. 类型转换与多个基类 编译器不会在派生类向基 ...
- C++学习之多重继承与虚继承
一.多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分.同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义 ...
- C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题
#include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...
- Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)
前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...
- C++虚继承作用
C++虚继承可以防止多重继承产生的二义性问题. 虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类.虚继承在多重继承的时可以防止二义性. clas ...
随机推荐
- IMAGENT CLASSIFICATION WITH DEEP CONVOLUTIONAL NEURAL NETWORKS(翻译)
0 - 摘要 我们训练了一个大型的.深度卷积神经网络用来将ImageNet LSVRC-2010竞赛中的120万高分辨率的图像分为1000个不同的类别.在测试集上,我们在top-1和top-5上的错 ...
- 如何访问IPV6?很简单,几个命令行即可。
参考:清华大学ISATAP隧道配置方法 简单介绍一下windows下的配置方法,其他系统的配置方法详见上面提供的个链接. 首先打卡管理员权限的命令行窗口,依次输入如下命令即可 netsh int ip ...
- mysql定时任务用到存储过程和定时任务
需求: 需要将t_app_message中的消息(将要被发送的消息)给每一个学生发送一遍,并且在发送完成后,将消息置为已发送状态已发送状态. 一言不合上代码 /*删除存储过程*/ drop proce ...
- 学习基础和C语言基础调查
学习基础和C语言基础调查 一.一种比大多数人(超过90%以上)更好的技能 说句实话,我还没有那种特别特别自信的.说我能拿得出手的.所谓能超过百分之九十以上的人的技能.毕竟人外有人,天外有天. 姑且算上 ...
- Excel自动建组
已用于测试用例自动创建组 使用要求:A列的格式如:X.X.X.X.X11.11.1.11.1.1.11.1.1.1.11.1.1.21.1.21.22 会自动将1.1.1.1.1-1.1.1.1.X组 ...
- ORACLE IMPDP导入报表数据已存在
背景 搞了这么多年oracle,不论是开发和运维,自认为是都了解了,和dba差的只是熟练的问题,因为毕竟不是天天搞它.不过突然听说数据泵导入的功能,大吃一惊,好像有印象,以为是落后的,一查,竟然是先进 ...
- 数据库join union 区别
join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集. 1.JOIN和UNION区别 join 是两张表做交连后里 ...
- 从MySQL中导入数据到MongoDB中
从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields ter ...
- delhpi:http超时设置(转载)
原文地址:http://www.delphitop.com/html/kongjian/544.html var FHTTPClient:TIdHTTP; begin FHTTPClient := T ...
- Redis的安装、配置及测试
Redis下载地址 https://github.com/MicrosoftArchive/redis/releases(如果需要安装windows服务版本,需要下载msi格式) 或 https:// ...