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

C++中的继承成本

C++中的继承成本是指在使用继承关系时所带来的开销和影响。继承是面向对象编程中的一种重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。然而,继承并非没有代价,它可能会导致一些性能和设计上的问题。

继承的成本主要体现在以下几个方面:

  1. 运行时开销:继承关系在运行时需要进行动态绑定,即在调用方法时需要通过虚函数表进行查找,这会带来一定的性能开销。特别是在多层继承的情况下,虚函数表的查找可能会变得更加复杂和耗时。
  2. 内存占用:继承关系会增加对象的内存占用。子类对象除了包含自身的成员变量外,还会包含父类的成员变量。如果存在多层继承,每一层都会增加额外的内存开销。
  3. 耦合性增加:继承关系会增加类之间的耦合性,子类与父类之间的紧密关联可能会导致代码的可维护性和可扩展性下降。任何对父类的修改都可能影响到所有的子类。
  4. 设计复杂性:继承关系的设计需要仔细考虑,合理的继承结构能够提高代码的可读性和可维护性,但不当的继承设计可能会导致代码的混乱和难以理解。

在实际应用中,我们需要权衡继承带来的成本和好处。如果继承关系确实能够简化代码结构、提高代码的复用性和可扩展性,那么继承的成本可能是可以接受的。但在某些情况下,可以考虑使用其他的设计模式或技术来替代继承,以避免继承带来的成本和问题。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++继承

protected继承: 基类所有 public 成员在派生类为 protected 属性; 基类所有 protected 成员在派生类为 protected 属性; 基类所有 private...private继承: 基类所有 public 成员在派生类均为 private 属性; 基类所有 protected 成员在派生类均为 private 属性; 基类所有 private...,但是会存在越界访问问题 //ps2->_No = 10; } 继承作用域 在继承体系基类和派生类都有独立作用域。...(在子类成员函数,可以使用 基类::基类成员 显示访问) 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 注意在实际继承体系里面最好不要定义同名成员。...因为从菱形继承下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性问题。在Assistant对象Person成员会有两份。

7210

C++继承

⭐前言:相信许多人人都写过学生管理系统、电商管理系统等等项目,如果我们去用C++去写,并且用类来封装老师、学生、宿管等等角色属性,我们就会发现,有不少属性是相同,从而会造成代码冗余。...在派生类不可见 在派生类不可 解析: ①public继承:当子类通过public继承,那么,父类public成员就是子类public成员,父类protected成员就是子类protected...③private继承:当子类通过private继承,那么父类那么父类private成员和private成员在子类中都是子类private成员。...这里不可见是指基类私有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。也就是说,基类私有成员不想给派生类继承。...多继承本身没啥问题,但是多继承带来了一种特殊继承方式:菱形继承。菱形继承会导致代码冗余和二义性问题,这是C++初次设计多继承时留下了问题。

92530

C++继承继承语法与菱形继承

继承语法 C++允许一个类继承多个类 语法: class 子类 :继承方式 父类1 , 继承方式 父类2......多继承可能会引发父类中有同名成员出现,需要加作用域区分 C++实际开发不建议用多继承 示例: class Base1 { public: Base1() { m_A = 100; } public...; cout << s.Base2::m_A << endl; } int main() { test01(); system("pause"); return 0; } 总结: 多继承如果父类中出现了同名情况...羊继承了动物数据,驼同样继承了动物数据,当草泥马使用数据时,就会产生二义性。...使用了虚继承后对比未使用虚继承解决菱形继承 总结: 菱形继承带来主要问题是子类继承两份相同数据,导致资源浪费以及毫无意义 利用虚继承可以解决菱形继承问题

68310

C++继承 ⑨ ( 继承成员变量同名处理方案 )

一、继承成员变量同名处理方案 1、继承成员变量同名场景说明 子类 继承 父类 成员 , 如果 子类 定义了 与 父类成员变量 同名 变量 , 子类 仍然 可以 继承 父类 同名 成员变量...: 继承自父类成员变量 , 使用 父类名称::成员变量名称 替代 成员变量名称 , 如 : Parent 是父类名称 variable 是父类变量名称 如果子类也定义了 variable...variable ; // 不使用域作用符 variable // 使用子类域作用符 Child::variable 二、代码示例 - 继承成员变量同名处理方案 ---- 代码分析 : 在下面的代码..., 也可以不使用域作用符 , 直接访问 b ; 子类 Child , 定义了 print 成员函数 , 在该函数 , 通过 Parent::b 访问 继承自父类 b 成员 , 通过 Child:..., 访问 继承自父类 成员变量 ; Child child; // 访问 子类对象 child 继承自 父类 b 成员 child.Parent::b = 10; 完整代码示例 : #

21720

C++继承 ⑦ ( 继承对象模型分析 | 继承构造函数和析构函数 )

一、继承对象模型分析 1、继承代码示例 下面有 3 个类 , 分别是 A 类 , B 类 , C 类 ; A 类是 基类 ; B 类 公有继承 A 类 , 并定义了新 成员变量 y ; C 类...: A 类对象 objA 中有一个成员 int x , 在内存只有一个 int 类型空间 ; B 类对象 objB , 除了继承自 A 类 int x 成员 , 还有一个自己 int y...成员 , 在内存是 2 个 int 类型空间 ; C 类对象 objC , 除了继承自 B 类 int x 和 int y 成员 , 还有一个自己 int z 成员 , 在内存是 3 个...int 类型空间 ; 3、问题引入 - 派生类对象构造函数和析构函数调用 上述 继承 过程 , 每一层继承 , 都继承了上一级 父类 成员变量 , 同时自己也定义了新成员变量 ; 在 派生类对象...---- 1、子类构造函数与析构函数调用顺序 继承构造函数和析构函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 构造函数 对 继承自父类 成员变量 进行 初始化 操作

18040

C++继承对象模型与继承构造和析构顺序

继承对象模型 问题:从父类继承过来成员,哪些属于子类对象?...打开工具窗口后,定位到当前CPP文件盘符 然后输入: cl /d1 reportSingleClassLayout查看类名 所属文件名 效果如下图: 结论: 父类私有成员也是被子类继承下去了...,只是由编译器给隐藏后访问不到 继承构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类构造函数 问题:父类和子类构造和析构顺序是谁先谁后?...<< endl; } }; void test01() { //继承 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 Son s; } int main() { test01...(); system("pause"); return 0; } 速记:构造时现有父亲后又儿子,析构顺序相反(白发送黑发) 总结:继承 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

56020

C++:49---继承友元

一、友元在继承关系 我们在友元文章中介绍过,友元关系不能继承。 (1)友元关系不存在传递性,即每个类负责控制自己友元类或者友元函数; (2)友元关系是单向,不具有交换性。...若类B是类A友元,类A不一定是类B友元,要看在类是否有相应声明。 (3)友元关系不能被继承。...因此: 基类友元不能访问派生类新成员,但是仍可以访问派生类从基类继承而来成员/方法 派生类友元也不能随意访问基类成员 二、演示案例 class A { private: int a; friend...,可以访问其任何成员 int f2(B b) { return b.a; }; //正确,因为B继承了A,所以B也包含了Aa int f3(B b) { return b.b; }; //错误,C不是...B友元,不能访问其私有成员 };

38130

C++继承(多继承、菱形继承?)

所以子类给父类赋值后,切割继承那个同名变量,那个子类自己同名变量是不会被赋值过去! Ⅳ. 继承作用域 在继承体系基类和派生类都有 独立作用域。...C++不能容忍数据冗余和二义性,于是提出了一个解决方案: 虚继承(virtual) 2.通过虚继承解决菱形继承问题 方案:在类腰部位置加一个 virtual 关键字: 注意: 虚继承 virtual...再配合刚刚我们讲指定作用域,二义性也可以得到很好解决。 那么问题来啦,C++编译器是如何通过虚继承解决数据冗余和二义性呢?...继承总结和反思 很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。...多继承可以认为是C++缺陷之一,很多后来OO语言都没有多继承,如Java。 虽然虚继承解决了菱形继承坑,但是也付出了一定代价: 对象模型更加复杂,学习成本更高了 有一定效率影响

1.9K20

C++继承

这篇文章开始,我们来学习一下C++继承。 1. 继承概念及语法 相信大家对于继承这个词应该都不陌生,所以在这篇文章学习之前,大家可以先联想一下现实生活继承是怎么样。...C++里面呢也有继承概念,那C++继承我们该如何去理解呢? 1.1 继承概念 其实不仅在C++这门语言里有继承概念,大多数面向对象语言都支持继承。...相信说到这里,大家对于C++继承概念已经有了一定理解了,那继承语法是怎样呢?我们如何去定义一个继承类呢?...继承作用域 3.1 基类和派生类作用域相互独立 首先大家要知道: 在继承体系基类和派生类都有各自独立作用域。...+复杂菱形继承及菱形虚拟继承,敬请期待…

8710

C++继承

,所以在面向对象程序设计,提供了一种新方式——继承与派生; 在c++中将继承一方称作派生类或者子类,将被继承一方叫做基类或者父类继承基本格式如下(CB 继承CA): class CA { public...: 通过这个表我们可以总结出一下几点: 1)私有成员在任何情况下都不能被派生类访问; 2)公有继承下其他基类成员在派生类访问属性不变; 3)私有继承下其他基类成员在派生类全部变为私有; 4)保护继承下其他类成员在派生类全部变为保护属性...; 从这个表我们可以看出,私有继承与保护继承对于基类访问属性完全相同,那么它们有何区别呢?...保护成员访问情况与私有相同,即类保护成员在类内可以访问在类外不能访问,它们二者区别在这个表确实没有体现出来,主要区别可以在下一层继承中体现比如有三个类继承关系为CC->CB->CA,继承类型分别为...,我们知道基类非私有成员在保护继承下公有的变为保护,保护仍然为保护,而私有继承则是将所有都变为私有,他们之间如果都是保护继承方式,那么CA其他成员在CB中都变为保护类型那么在CC仍然能够访问到

57120

C++继承

公有 / 保护 属性,并且能做到互不干扰 1.3、实际例子 在实际开发继承 会经常用到(不然也不会作为 面向对象三大特性 之一了) 比较经典例子:C++ IO 流玩继承,并且还是菱形继承...b,并且还是 公有继承 注:Java 继承符号为 extern,而 C++ 为 : 2.2、权限 继承有权限概念,分别为:公有继承(public)、保护继承(protected)、私有继承...在父类设计相应函数,获取私有成员值进行间接访问即可 其实 C++ 搞这么多种情况(9种)完全没必要,实际使用,最常见到组合为 public : public 和 protected : public...在通过后者实现前者时,可以通过 组合,也可以通过 继承 ---- 总结 以上就是本次关于 C++继承全部内容了,在本篇文章,我们重点介绍了继承相关知识,如什么是继承、如何继承继承该注意些什么...,最后还学习了多继承模式容易引发菱形继承问题,探究了其原因及解决方法,关于继承是如何辅助实现多态,可以期待下篇文章:C++【多态】 ----

12410

C++继承

C++继承 继承概念与定义 概念 定义 基类与派生类对象赋值转换 继承作用域 成员同名 函数同名 派生类默认成员函数 继承与友元 继承与静态成员 多继承 菱形继承继承继承原理...那么如果像往常一样去定义,会写很多重复内容。 这时候C++就提供了一种语法叫做继承。...当然,父类内容里面也是有三种访问限定符,父类访问限定符和继承方式也是有关系 ,所以这样看来,就有9方式了。...成员 派生类protected成员 派生类protected成员 派生类private成员 基类private成员 在派生类不可见 在派生类不可见 在派生类不可见 1.这里不可见是指基类私有成员还是被继承到了派生类对象...继承作用域 成员同名 在继承体系基类和派生类都有独立作用域。 这说明命名是可以重复,那么同名成员要怎么算呢?

42510

C++继承

但只要有多继承存在,就会出现菱形继承,而菱形继承就是C++继承一个大坑,Java知道C++因为有了多继承之后,出现菱形继承大坑,所以Java为了避免菱形继承大坑,规定Java只能有单继承不能有多继承...C++为了解决菱形继承带来问题采用了虚拟继承方式来进行解决,即在菱形继承腰部位置采用virtual继承来解决菱形继承大坑。 5....iostream就是C++用菱形继承设计出来,但是也就大佬能用用了,如果我们自己用肯定得被别人骂死。因为有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。...//C++引入虚拟继承来解决菱形继承数据冗余和二义性问题。...多继承可以认为是C++一个大坑,所以很多后来产生语言都没有多继承,只允许单继承存在,例如Java.继承和组合都是代码复用一种手段。 2.

63210

C++继承

Contents 1 基本概念 2 访问控制和继承 3 继承类型 4 多继承 5 参考资料 基本概念 面向对象程序设计一个重要概念就是继承继承允许我们依据另一个类来定义一个类。...当创建一个类时,您不需要重新编写新数据成员和成员函数,只需指定新建继承了一个已有的类成员即可。这个已有的类称为基类,新建类称为派生类。...因此基类成员如果不想被派生类成员函数访问,则应在基类声明为 private。...当使用不同类型继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类公有成员也是派生类公有成员,基类保护成员也是派生类保护成员,基类私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类公有和保护成员将成为派生类私有成员。 多继承继承即一个子类可以有多个父类,继承了多个父类成员变量和函数。

36320

C++继承

2、继承定义 定义格式 继承定义格式如下:其中 Person 类是父类/基类,Student 类是子类/派生类,public 是继承方法; 继承方法 C++继承一共有三种方式 – public...final 在 C++ ,如果我们希望一个类不被继承该如何做到呢?...3、菱形虚拟继承 为了解决菱形继承数据冗余和二义性问题,C++引入了虚拟继承 – 虚拟继承可以解决菱形继承二义性和数据冗余问题,如上面的继承关系,在 Student 和 Teacher 继承 Person...同时,多继承可以认为是 C++ 缺陷之一,很多后来面向对象语言都吸取了 C++ 经验,将多继承给去除了,比如 Java。...注:在实际工作,菱形继承基本上不会遇到,所以也就不存在虚继承问题,但是在校招中比较喜欢考察虚继承,以此来检测同学们对 C++ 理解。

83300

C++继承

1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式变化 总结: 基类private成员在派生类无论以什么方式继承都是不可见。...继承作用域 在继承体系基类和派生类都有独立作用域。 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员直接访问,这种情况叫隐藏,也叫重定义。...总之:在实践可以设计多继承,但是切记不能设计菱形继承,因为太复杂了,容易出各种问题。 继承公共基类叫做多继承。 8. 继承总结和反思 很多人说C++语法复杂,其实多继承就是一个体现。...多继承可以认为是C++缺陷之一,很多后来OO语言都没有多继承,如Java。 继承和组合 (1)public继承是一种is-a关系。也就是说每个派生类对象都是一个基类对象。...这种通过生成派生类复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式,基类内部细节对子类可见。

8310

c++继承

当创建一个类时,您不需要重新编写新数据成员和成员函数,只需指定新建继承了一个已有的类成员即可。这个已有的类称为基类,新建类称为派生类。 继承代表了 is a 关系。...因此基类成员如果不想被派生类成员函数访问,则应在基类声明为 private。...当使用不同类型继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类公有成员也是派生类公有成员,基类保护成员也是派生类保护成员,基类私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类公有和保护成员将成为派生类私有成员。 多继承继承即一个子类可以有多个父类,它继承了多个父类特性。...C++ 类可以从多个类继承成员,语法如下: class :,,… { }; 其中,访问修饰符继承方式是 public、protected

33110

复杂C++继承

这里继承也差不多是这个意思:在一个程序中有很多不同类,但是这些类可能有共同属性(成员变量或成员方法),为了避免多次对同样成员方法和成员变量声明,C++就提出了继承继承是类设计层次代码复用。...成员 派生类private 成员 基类private成员 在派生类不可见 在派生类不可见 在派生类不可 父类private成员在子类是不可见,不可见并不是因为没有被继承下来,只是不能被访问...继承作用域(隐藏) 父类和子类都有各自独立类域,如果它们有同名成员函数(不是继承下来),就会产生隐藏。所谓隐藏就是对在子类只能看到子类自己定义函数,在父类也是一样。为什么不是函数重载?...这样就解决了菱形继承成员冗余问题。 此时A被称为虚基类,继承B和C类要找到A成员,就要通过虚基表偏移量来计算。...在实际使用时候,不要设计菱形继承,因为这是C++一个大坑,跳进去就基本上爬不出来了哦。

20530
领券