读书笔记--C++程序设计(第2版)--11.6多重继承(与虚基类)

2023-12-16 07:48

本文主要是介绍读书笔记--C++程序设计(第2版)--11.6多重继承(与虚基类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多重继承(与虚基类)

1. 多重继承说明

也就是,一个派生类有两个或多个基类(派生类继承了两个或者多个基类的属性)。

2. 多重继承的书写形式为

举例形式说明:

如果已经声明了类A,类B,和类C,可以声明多重继承的派生类D

class D:public A,private B,protected C

{类D中新增加的成员}

注意:在多重继承时,要分别写出各个基类的继承方式。

3. 多重继承的构造函数形式为

派生类构造函数名(总参数表):基类1构造函数(参数表),基类2构造函数(参数表),基类3构造函数(参数表),,,

{派生类中新增数据成员初始化语句}

注意:调用基类构造函数的顺序,是按照声明派生类时基类出现的顺序(即第2条时的情况来定的),并不是根据定义派生类构造函数的顺序来的。

4. 多重继承的一个很重要的问题说明---多重继承引起的二义性问题

二义性的由来:多重继承时,几个基类中可能会有相同的成员(包括数据成员和成员函数),这样如果不加以说明,则程序执行时就会有不知道要调用哪里的数据或函数,从而产生错误,即为二义性。

二义性的处理方法:

(1). 不出现相同的数据成员或成员函数,,当然这样处理方法很不现实。

(2). 用基类名来限定,,比如A::a,即代表派生类中的基类A的数据成员a。

(3).当派生类中也有跟基类相同的成员时,派生类的会将基类的成员屏蔽掉(即,派生类是有效的)。

(4). 虚基类的处理的情况(如下说明)。

==========================================================================

5. 虚基类说明

由来:多重继承时,派生类的多个基类可能是来自于同一个更高层次的基类,这是就会出现这个更高层次的基类中的成员,在派生类中出现二义性,而且派生类中将拷贝多份基类成员,这将占用过多的空间,而实际上,很多时候并不需要这么多份拷贝(有时候应该也会有需要的时候)。

虚基类作用:使得在继承共同的基类时只保留一份成员。

6. 虚基类书写形式

class 派生类名:virtual 继承方式 基类名

举例:将类A声明为虚基类,方法如下:

class A

{......}

class B : virtual public A

{......}

class C : virtual public A

{......}

注意:(1). 虚基类并不是基类的本身属性,而是在声明派生类时,指定的继承方式的声明。

(2). 为了保证虚基类在派生类时只继承一次,应当在该基类所有的直接派生类中声明为虚基类,不然仍然会出现对基类的多次继承。

(3). 虚基类的初始化(即构造函数书写问题):由于派生类中只有一份数据成员,所以现在这份基类数据成员必须由派生类来直接给出。所以,这里,在最后的派生类中,不仅要负责对其直接积累进行初始化,还要负责对虚基类初始化。

 

这篇关于读书笔记--C++程序设计(第2版)--11.6多重继承(与虚基类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499707

相关文章

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Python多重继承慎用的地方

《Python多重继承慎用的地方》多重继承也可能导致一些问题,本文主要介绍了Python多重继承慎用的地方,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录前言多重继承要慎用Mixin模式最后前言在python中,多重继承是一种强大的功能,它允许一个

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指