首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:13---继承(单一继承、多重继承多级继承、菱形继承、虚继承

一、基类与派生类的概念 基类(父类):继承关系中处于上层的类 派生类(子类):继承关系中处于下层的类 class A; class B; class C:public A //C为A的子类,A为C...A //多重继承 { }; 六、多级继承 一个子类还可以作为另一个类的父类而派生出另一个子类。...宏观上叫做多级继承 class A{}; class B :public A {}; class C :public B { }; 七、菱形继承 概念:A作为基类,B和C都继承与A。...最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此访问某些成员的时候会发生二义性...虚继承的作用:为了保证公共继承对象创建时只保存一分实例 虚继承解决了菱形继承的两个问题: 数据冗余:顶级基类整个体系中只保存了一份实例 访问不明确(二义性):可以不通过作用域访问符::来调用(原理就是因为顶级基类整个体系中只保存了一份实例

3.4K30

C++ 多级继承与多重继承:代码组织与灵活性的平衡

C++ 多级继承多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。多级继承的语法 C++ 中,使用 : 符号来指定继承关系。...多级继承的优点代码重用: 多级继承允许您从现有类中继承代码,减少重复开发并提高代码效率。代码组织: 多级继承有助于将代码组织成层次结构,使复杂系统更容易理解和维护。...灵活性: 多级继承使您可以创建具有复杂功能和行为的类。多级继承的缺点复杂性: 多级继承会导致类层次结构变得复杂,难以理解和维护。菱形继承问题: 菱形继承可能导致命名冲突和语义不明确问题。...但是,它也存在一些缺点,例如复杂性和菱形继承问题。使用多级继承之前,请仔细权衡其优缺点,并考虑其他设计模式。C++ 多重继承多重继承允许一个类从多个基类继承属性和方法。...受保护继承: 派生类继承所有受保护成员,但这些成员派生类中变为私有。总结多重继承是一种强大的 OOP 工具,可用于创建复杂的类层次结构。但是,它也存在一些缺点,例如复杂性和菱形继承问题。

12210
您找到你想要的搜索结果了吗?
是的
没有找到

C++核心准则C.129:设计类层次关系时,区分实现继承和接口继承

接口继承是将继承用于使用户和实现隔离,尤其是允许不影响使用基类的用户的前提下增加和修改派生类。...早期的面向对象编程(例如1980年代到1990年代)中,实现继承和接口继承经常被混合使用,这样的恶习很难改掉。即使是现在,旧代码或者旧风格的培训资料中两种方式的混合体也会经常见到。...First we devise a hierarchy of interface classes: 首先我们设计一个接口类的层次关系。...现在Shape作为包含实现的类例子有点简陋,但是请保持耐心,因为这个例子同样可以用于更复杂层次关系。...and virtual functions (except for calls from a derived class member to a base class member) 标记将派生类转换为既包含数据又包含虚函数的基类的情况

46010

C++核心准则C.146:如果无法避免继承层次中移动,使用dynamic_cast

C.146: Use dynamic_cast where class hierarchy navigation is unavoidable C.146:如果无法避免继承层次中移动,使用dynamic_cast...继承体系中移动时如果可能(不需要执行时决定)而且更便利的话应该利用静态多态机制。...例如,合适的条件下,dynamic_cast可以很短的固定时间内完成。然而,兼容性使变更很困难,即使所有人都同意优化的有价值的。...存在非常罕见的情况,如果你已经判定dynamic_cast的影响是确实存在的,你可以使用其他的方式静态保证向下转换会成功(例如,你小心地使用了CRTP),而且不涉及到虚继承的话,可以考虑战术上采用带有明显注释的...即使做到这种程度,我们的经验中,像这样“我知道我在做什么"的情况仍然是一个有名的错误源。

62510

C++】异常处理 ⑦ ( 异常类的继承层次结构 | 抛出 捕获 多个类型异常对象 | 抛出子类异常对象 捕获并处理 父类异常对象 )

自定义的 异常类 , 可能存在 继承结构 , 也就是说 同一个 try-catch 代码块中 , 如果需要 拦截 和 处理多个 异常时 , 如果 这些异常都继承相同的父类 , 只需要拦截一个 父类异常即可..., 本篇博客中 , 讨论 抛出 / 捕获 的 异常类 存在 继承结构 的情况 ; 一、抛出 / 捕获 多个类型异常对象 1、抛出 / 捕获 多个类型异常对象 定义一个函数 , 传入一个 int 类型的参数...二、异常类的继承层次结构 1、抛出子类异常对象 / 捕获并处理 父类异常对象 如果 抛出 / 捕获 多个类型的异常对象 , 每次拦截处理异常时 , 都要手动编写多个 catch 分支 , 不利于代码维护...; 如果将 相似类型的异常 都继承自 一个父类 , 那么每次拦截时 , 只需要拦截一个父类异常即可 ; 定义父类异常 , 其中定义一个纯虚函数 , 该纯虚函数是异常打印 , 或者异常处理的通用操作 ;...class eSize { public: virtual void printError() = 0; }; 剩余的 4 个异常类 , 都继承 异常类父类 , 并实现纯虚函数 ; class eNegative

15610

cc++问题集四

,如果基类都没有虚函数,就是特属子类的虚函数指针 image.png image.png image.png 2、c++泛型编程 泛型C++中的主要实现为模板函数和模板类。...+四种cast及其使用 static_cast static_cast content:静态转换,在编译期间处理 主要用于C++中内置的基本数据类型之间的转换,例如int转换为char,把int...还用于各种隐式转换,比如非constconst,void*指针等。 多态中: 用于基类和子类之间的指针或引用的转换。...4、虚继承 菱形继承中,有多重继承的问题,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题。...在数据库设计中将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。

74240

C++中的四种类型转换运算符

例如,老式的C风格的 double int 的写法为: double scores = 95.5; int n = (int)scores;C++ 新风格的写法为: double...int、int double、const 非 const、向上转型等;void 指针和具体类型指针之间的转换,例如void *int *、char *void *等;有转换构造函数或者类型转换函数的类与其它类型之间的转换...更多关于 const 的内容请猛击《C++中的const又玩出了新花样》。...dynamic_cast 关键字dynamic_cast 用于类的继承层次之间进行类型转换,它既允许向上转型(Upcasting),也允许向下转型(Downcasting)。...C++ RTTI机制下的对象内存模型(透彻)》一节中,我们讲到了有虚函数存在时对象的真实内存模型,并且也了解到,每个类都会在内存中保存一份类型信息,编译器会将存在继承关系的类的类型信息使用指针“连接

21820

C++:特殊类设计和四种类型转换

1、隐式类型转换:编译器在编译阶段自动进行,能,不能就编译失败。相近类型才可以进行隐式类型转换 ,比如int和double 他们本质上都是表示数据的大小。...3、为什么 dynamic_cast只能用于父类含有虚函数的类 dynamic_cast转换是在运行时进行转换,因为只有对于这种类层次结构,才应该将派生类的地址赋给基类指针。...运行时转换就需要知道类对象的信息(继承关系等)。C++对象模型中,对象实例最前面的就是虚函数表指针,通过这个指针可以获取到该类对象的所有虚函数,包括父类的。...因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,转换的时候就可以用来判断对象有无继承关系。 所以虚函数对于正确的基类指针转换为子类指针是非常重要的。...C++通过以下方式来支持RTTI: 1. typeid运算符(返回指出对象类型的值) 2. dynamic_cast运算符(根据虚基表判断有无继承关系,并判断是否可以转化) 3. decltype

9210

C++编译期多态与运行期多态

面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态...本文中,我们将了解: 什么是运行期多态 什么是编译期多态 它们的优缺点在哪 运行期多态 运行期多态的设计思想要归结到类继承体系的设计上去。...对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,基类中将这些功能声明为虚接口(虚函数),然后由子类继承基类去重写这些虚接口,以实现子类特有的具体功能。...能够处理同一个继承体系下的异质类集合。 运行期多态缺点 运行期间进行虚函数绑定,提高了程序运行开销。 庞大的类继承层次,对接口的修改易影响类继承层次。...关于显式接口与隐式接口 所谓的显式接口是指类继承层次中定义的接口或是某个具体类提供的接口,总而言之,我们能够源代码中找到这个接口.显式接口以函数签名为中心,例如 void AnimalShot(Animal

1.2K40

C++结构体和类的区别_c++有结构体吗

堆的空间相对较大.但是存储堆中的数据的访问效率相对较低. 3.类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体也可以继承,也可以有函数(c中结构体没有函数),...结构体和类可以交叉继承继承权限取决于子类而不是基类。...public: T age; }; template \\错误 struct Person { public: T age; }; 7.C语言中,空结构体的大小为0,而C+...C++中空类的大小为1的原因:   空类也可以实例化,类实例化出的每个对象都需要有不同的内存地址,为使每个对象在内存中的地址不同,所以类中会加入一个隐含的字节。...表现抽象和多级别的对象层次时,类是最好的选择 4. 大多数情况下该类型只是一些数据时,结构时最佳的选择,因为类访问数据 通常需要函数辅助。

93510

QT(C++)面试总结

派生类的对象可以隐含转换为基类对象; 派生类的对象可以初始化基类的引用; 派生类的指针可以隐含转换为基类的指针。...C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。 C++ 类(纯虚函数和抽象类) a. 纯虚函数是一个基类中只有声明的虚函数,基类中无定义。...它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。...dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。...层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的; 进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

1.9K10

图说C++对象模型:对象内存布局详解

下面的文章中将常使用指针访问对象内存来验证我们的C++对象模型,以及讨论各种继承情况下虚表指针的变化,先把这部分的内容消化完再接着看下面的内容。...那么,这个类在内存中将被如何表示?5种数据都是连续存放的吗?如何布局才能支持C++多态? 我们的C++标准与编译器将如何塑造出各种数据成员与成员函数呢?...为了方便叙述,我们不使用上面的代码了,而重新写一个重复继承继承层次: ?...6.1.虚基类表解析 C++对象模型中,虚继承而来的子类会生成一个隐藏的虚基类指针(vbptr),Microsoft Visual C++中,虚基类表指针总是虚函数表指针之后,因而,对某个类实例来说...7.2.下面这个空类构成的继承层次中,每个类的大小是多少?

3.7K43

C++ Primer 学习笔记_87_用于大型程序的工具 –异常处理

用于大型程序的工具 —异常处理 引言: C++语言包括的一些特征问题比較复杂,非个人所能管理时最为实用。如:异常处理、命名空间和多重继承。...相反,假设抛出一个数组,被抛出的对象转换为指向数组首元素的指针,相似的,假设抛出一个函数,函数转换为指向该函数的指针。...2、异常与指针 假设指针指向继承层次中的一种类型,指针所指对象的类型就有可能与指针的类型不同。不管对象的实际类型是什么,异常对象的类型都与指针的静态类型相匹配。...3)将数组转换为指向数组类型的指针,将函数转换为指向函数类型的适当指针。 查找匹配catch的时候,不同意其它转换。...由于catch子句按出现次序匹配,所以使用来自继承层次的异常的程序将它们的catch子句排序,以便派生类型的处理代码出如今其基类类型的catch之前。

69410

2023 年 30 个 OOP 面试问题和答案

有哪些不同类型的继承继承可以分为以下5种类型: 单继承: 子类直接从基类派生 多重继承: 子类派生自多个基类。 多级继承: 子类派生自一个同时也派生自另一个基类的类。...层次继承: 多个子类派生自一个基类。 混合继承继承由上述指定的多种继承类型组成。...一个层次继承的示例 class Father { // 任何特定于父亲的属性和函数 } class Son extends Father { //继承了父类的属性和函数 } class Daughter...extends Father { //继承了父类的属性和函数 } Java // 多级继承的一个例子 class Father { // 父亲的任何特定属性和功能 } class Son extends...C++中,结构体和类之间有什么区别? C++中,结构体和类之间有什么区别? 结构体和类之间的主要区别在于,结构体中,成员默认为公共访问级别,而在类中,默认为私有访问级别。

26130

今年的面试太难了?2023 年 30 个 OOP 面试问题和答案也许可以帮到你

有哪些不同类型的继承继承可以分为以下5种类型: 单继承: 子类直接从基类派生 多重继承: 子类派生自多个基类。 多级继承: 子类派生自一个同时也派生自另一个基类的类。...层次继承: 多个子类派生自一个基类。 混合继承继承由上述指定的多种继承类型组成。...一个层次继承的示例 class Father { // 任何特定于父亲的属性和函数 } class Son extends Father { //继承了父类的属性和函数 } class Daughter...extends Father { //继承了父类的属性和函数 } Java // 多级继承的一个例子 class Father { // 父亲的任何特定属性和功能 } class Son extends...C++中,结构体和类之间有什么区别? C++中,结构体和类之间有什么区别? 结构体和类之间的主要区别在于,结构体中,成员默认为公共访问级别,而在类中,默认为私有访问级别。

32741

比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

C++是基于类的模型 对象模型:继承 (1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构? C++采用任意的类层次结构; (2)  继承方式:提供哪些继承方式?...C++允许单继承、多继承、多重继承和虚继承继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构; C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题...C++支持静态对象和自动对象: 静态对象:变量定义函数外或是用static关键字修饰的变量存放在静态存储区。放在静态存储区的数据整个程序运行期间持续有效。...Java是基于类的模型; 对象模型:继承 (1)  Java采用单根的类层次结构: 单根层次结构:Java中,所有类都应从单独一个基础类继承,终级基础类为“Object”。...Python 2.2版本以后,采用单根的类层次结构; 单根层次结构:所有类是否都应从单独一个基础类继承Python中,所有类都是Object类的子类 (2)  继承方式:提供哪些继承方式?

1.6K10
领券