第十七章:用于大型程序的工具:多重继承与虚继承
多重继承是从多于一个直接基类派生类的能力。多重继承的派生类继承其所有父类的属性。
为了支持多重继承,应扩充派生列表,多个类用逗号分割。如:
class panda:public bear,public animal
{
};
注意每个基类都必须制定访问级别。public,private,protected,与单继承一样。
多重继承的派生类对象包含每个基类子对象。
像单继承一样,多继承派生类的构造函数,可以在构造函数初始化列表中给零个或基类传递值。
各基类的构造次序由类派生列表出现的次序决定,不受构造函数初始化列表出现的顺序影响。
构造函数与析构函数调用顺序相反。
单个基类的情况下,派生类的指针或引用可以自动转换为基类的指针或引用。对于多重继承也同样。派生类的指针或引用可以转换为其任意基类的指针或引用。因此在多重继承下,遇到二义性的可能性更大。如
void print(const base1&)
void pritn(const base2 &);
base1和base2是derived的基类。
derived d;
print(d);//二义性。
因为此时编译器发现转换为哪个基类都一样,没有最优匹配,因此报错。
多重继承的基类的指针或引用,只能访问基类中定义的成员,不能访问派生类新引入的成员。这与单继承相同。
当一个类继承与多个基类时,不允许使用一个基类的指针访问其他基类的成员。因为它们之间没有任何关系。
多重继承下的派生类的逐个成员的初始化、赋值和析构,表现的与单继承下完全相同。派生类使用基类自己的复制构造函数、赋值操作符或析构函数隐式构造、赋值或撤销每个基类。
如果派生类定义了自己的复制构造函数或赋值操作符,则应该自己负责复制或赋值所有的基类部分。
多重继承下,会对所有直接基类进行名字查找。很有可能从两个或多个基类中继承同名的成员,在使用时必须要明确指定想要使用哪个版本,这可以通过基类名::成员,进行指定。否则将会导致二义性。
多重继承下,一个基类可以在派生类出现多次。C++使用虚继承解决这个问题。虚继承是一种机制,类通过虚继承指出它希望共享的虚基类的状态。在虚继承下,对于给定虚基类,无论该类在派生类层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的子对象成为虚基类。
虚基类的指定可以在派生列表中通过关键字virtual设置。如
Class base1:virtual public base{};
Class base2:public virtual base{};
Class derived:public base1,public base2{};
任何可以被指定为基类的类,也可以被指定为虚基类。虚基类包含通常由非虚基类支持的任意类元素。基类为虚基类的派生类,也照样可以通过基类类型的指针或引用操纵派生类的对象。
通常每个类只初始化自己的直接基类。但是这对于虚基类却不成立。因为这样就可能导致虚基类被多次初始化的问题。为了解决这个问题,具有虚基类的派生类要特殊对待:在最低层的派生类的构造函数初始化列表中初始化虚基类。但是任何以虚基类为直接基类的类,也必须为该虚基类提供自己的初始化列表。对于上例的base,base1,base2.derived类继承层次。虚基类base并没有被初始化三次,而仅仅在derived中初始化一次,因为在base1和base2中均忽略对其的初始化。
在合成的默认构造函数中,无论虚基类出现在继承层次的任何地方,虚基类均先于所有其他的类构造。合成的复制构造函数使用同样的次序。因此自定义的复制构造函数和赋值操作符也应按此顺序。
分享到:
相关推荐
C++Primer中文第三版(C++从入门到精通)第一章的读书笔记,主要是C++程序、预处理器指示符、iostream库等的基础知识点读书笔记。
C++primer第五版第二章习题答案.pdf
第18章用于大型程序的工具............................................483 练习18.1 练 习18.30 第19章特殊工具与技术............................................... 502 练习19.1 练 习19.26
C++ primer plus 第五版的个人学习笔记,仅供大家学习参考。
C++ Primer 中文版(第四版)学习笔记~ C++ Primer 中文版(第四版)学习笔记~
C++primer的笔记,可以看一下,一些容易犯错的陷阱
c++primer第五版中文版课后答案(第17章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
《C++ Primer Plus第6版中文版》学习笔记(第十章) 红字内容是有疑问或者没把握的。 绿字部分是比较重要,或者经过确认的
c++primer第五版中文版课后答案(第12章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出类类型的异常 581 17.1.2 栈展开 582 17.1.3 捕获异常 583 17.1.4 重新抛出 585 17.1.5 捕获所有异常的处理代码 586 17.1.6 函数测试块与构造函数 586...
C++_Primer_中文版的学习笔记,C++_Primer全面介绍了 C++ 语言。作为一本入门书(Primer),它以教程的形式对 C++ 语言进行清晰的讲解,并辅以丰富的示例和各种学习辅助手段。
C++primer 课后题答案 目录 第一章 快速入门 2 第二章 变量和基本类型 7 第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 ...第十七章 用于大型程序的工具 138 第十八章 特殊工具与技术 138
C++ Primer 第四版学习笔记是本人2014年学习C++时的学习笔记,今天分享出来给初学者,让大家学习起来不在枯燥。需要的同学自行下载,大佬请绕道!
1.1章 快速入门 - 复习 2.12章 类定义(一) 3.12章 类定义(二) 4.12章 类定义(三) 5.12章 隐含的this指针 6.12章 类作用域 ... 7.12章 构造函数 ... 42.17章 多重继承与虚继承 43.18章 特殊工具与技术
C++PrimerPlus6中文版第四章程序
c++primer第五版中文版课后答案(第18章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
《C++ Primer》第五版中文版学习笔记,适合完整看过原书一遍以上的人员复习与查阅使用。对于基础较好的,也可直接适用。
C++ primer plus学习笔记.md
牛人的c++primer学习笔记,c++基础学习必须看的,努力中。
学习C++ primer时自己总结的一些知识点。 百页PDF