第十七章:用于大型程序的工具:多重继承与虚继承
多重继承是从多于一个直接基类派生类的能力。多重继承的派生类继承其所有父类的属性。
为了支持多重继承,应扩充派生列表,多个类用逗号分割。如:
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库等的基础知识点读书笔记。
第17章通常会关注C++中的特殊工具和技术,比如了运行时类型识别(RTTI)、智能指针、标准库中的其他组件以及C++11的特性等。在这一章节中,读者可以通过习题来加深理解并掌握这些高级特性。习题通常会提供一个实际...
这篇学习笔记主要涉及了C++编程的一些核心概念,包括程序结构、变量、基本类型、初始化与赋值、可读性、常量与引用、typedef、枚举以及标准库中的字符串和向量类型。 1. **程序结构**: - 每个C++程序都必须包含`...
C++primer第五版第二章习题答案.pdf
C++ primer plus 第五版的个人学习笔记,仅供大家学习参考。
以上是C++ Primer第四版学习笔记中涉及的一些核心知识点。这些知识点涵盖了C++编程的基础语法、数据类型、容器、指针、内存管理以及控制结构等多个方面,对于初学者理解和掌握C++语言具有重要意义。希望这些内容能够...
《C++ Primer(第4版)》是一本深入学习C++编程语言的经典教材,其课后习题答案提供了丰富的实践练习和问题解析,帮助读者巩固并深化对C++语法、概念的理解。以下将针对各章节的主要知识点进行详细阐述: 1. 第一章...
《C++ Primer》是C++编程领域的一本经典著作,第五版更是全面更新,涵盖了现代C++的新特性,包括C++11、C++14和C++17的重要改动。这本书是C++初学者和有经验的程序员深入理解语言的最佳资源之一。以下是基于这个主题...
但是,我可以根据《C++ Primer》第五版的内容结构以及一般C++的学习顺序,为读者提供第12章可能涵盖的知识点,并对C++11标准中的相关概念进行介绍。 第12章通常会涉及C++中的输入输出库(I/O库),这是C++编程中必...
这份笔记以清晰、实用的方式阐述了C++ Primer第四版中的知识点,对于想要踏入或深化C++编程的读者来说,是一份非常有价值的参考资料。 C++ Primer是C++编程领域的一本经典教材,第四版更是结合了现代C++的特性进行...
《C++ Primer Plus 第六版中文版》的学习笔记聚焦于第七章,主要讲解了C++中的函数,包括函数的分类、无返回值和有返回值的函数、返回值的类型限制、函数原型的重要性和作用,以及ANSI C与C++在函数原型上的差异。...
《C++ Primer 第4版》是一本经典的C++编程...这份“C++ Primer 第4版”学习笔记包含了所有这些知识点的详细解释和示例,是深入学习C++的理想资料。通过学习和实践,你可以掌握C++编程的基础,并逐步提升到高级水平。
《C++ Primer Plus第6版中文版》学习笔记(第十章) 红字内容是有疑问或者没把握的。 绿字部分是比较重要,或者经过确认的
《C++ Primer 中文第五版》是一本深受程序员喜爱的C++学习书籍,它全面而深入地介绍了C++编程语言的各个方面。这本书以其清晰的解释、丰富的实例和实用的建议,成为了初学者和有经验的程序员提升C++技能的重要参考...
《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...
第十二章“类和数据抽象”介绍了面向对象编程的基础,如封装、继承和多态。习题解答将涉及类的设计、对象的创建和使用,以及虚函数和抽象类的应用。 第十三章“复制控制”讲解了构造函数、析构函数、拷贝构造函数和...
在学习C++ primer的过程中,我们将会了解到计算机编程的基础知识和C++语言的特性。以下是一些重要的知识点,它们涵盖了C++语言的多个方面。 首先,我们需要了解计算机语言的分类。计算机语言分为机器语言、汇编语言...
《C++ Primer》是一本经典的C++学习教程,第五版是该书的最新版本,涵盖了C++11至C++14标准的最新特性。在IT行业中,掌握C++的重要性不言而喻,因此,这本书以及它的习题集被许多程序员和开发者用作学习和提升技能的...
从第七章到第十三章,这涵盖了类(classes)、对象(objects)、继承(inheritance)、多态(polymorphism)、模板(templates)以及异常处理(exception handling)等核心主题。以下是对这些章节习题源码中可能涉及...