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

【c++】C++中的继承&&菱形继承详解

; } 3.继承中的作用域 在继承体系中基类和派生类都有独立的作用域 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。...通过偏移量可以找到下面的A 下面是上面的Person关系菱形虚拟继承的原理解释 8.继承的总结和反思 很多人说C++语法复杂,其实多继承就是一个体现。...否则在复杂度及性能上都有问题 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 继承和组合 public继承是一种is-a的关系。...如何解决数据冗余和二义性的 菱形继承问题和虚继承是如何解决二义性与数据冗余的_数据的二义性-CSDN博客 C++继承的问题 : 菱形继承 (虚拟继承)_c++菱形继承问题-CSDN博客 3....继承和组合的区别?什么时候用继承?什么时候用组合? 【C++】继承和组合的概念?什么时候用继承?什么时候用组合?-CSDN博客

15910

C++中的继承

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

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

    C++中的继承

    继承关系和访问限定符: 继承基类成员访问方式的变化: 总结: 基类private成员在派生类中无论以什么方式继承都是不可见的。...继承中的作用域 在继承体系中基类和派生类都有独立的作用域。 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意在实际中在继承体系里面最好不要定义同名的成员。...总结与反思 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。...多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

    6810

    C++中的继承

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

    1K30

    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; } 总结: 多继承中如果父类中出现了同名情况...羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。...使用了虚继承后对比未使用虚继承解决菱形继承 总结: 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义 利用虚继承可以解决菱形继承问题

    73010

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

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

    42720

    【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、子类构造函数与析构函数调用顺序 继承中的构造函数和析构函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 的 构造函数 对 继承自父类的 成员变量 进行 初始化 操作

    24540

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

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

    58020

    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中也包含了A的a int f3(B b) { return b.b; }; //错误,C不是...B的友元,不能访问其私有成员 };

    45630

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

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

    2K20

    【C++】继承(定义、菱形继承、虚拟继承)

    在继承中,一般用公有和保护,少用私有。 总结: 基类private成员在派生类中无论以什么方式继承都是不可见的。...这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。...基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。...继承中的作用域 在继承体系中基类和派生类都有独立的作用域。 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意在实际中在继承体系里面最好不要定义同名的成员。

    15610

    C++继承

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

    60420

    【C++】继承

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

    14610

    C++继承

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

    45210

    C++【继承】

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

    15410

    C++继承

    基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 2....三、继承中的作用域 1. 在继承体系中基类和派生类都有独立的作用域,所以可以有同名成员。 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。...这里的答案是隐藏,注意在继承中,如果是成员函数,函数名相同就构成隐藏!... 1、很多人说C++语法复杂,其实多继承就是一个体现。...2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3.

    6910

    【C++】继承

    继承中的作用域 3.1 隐藏规则: 1. 在继承体系中基类和派⽣类都有独⽴的作⽤域。 2. 派⽣类和基类中有同名成员,派⽣类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。...菱形继承:菱形继承是多继承的⼀种特殊情况。菱形继承的问题,从下⾯的对象成员模型构造,可以看出菱形继承有数据冗余和⼆义性的问题,在Assistant的对象中Person成员会有两份。...⽀持多继承就 ⼀定会有菱形继承,像Java就直接不⽀持多继承,规避掉了这⾥的问题,所以实践中我们也是不建议 设计出菱形继承这样的模型的。...::_name = "yyy";     return 0; } 7.2 虚继承 很多⼈说C++语法复杂,其实多继承就是⼀个体现。...多继承可以认为是C++的缺陷之⼀,后来的⼀些编程语⾔都没有多继承,如Java。

    6100

    C++:继承

    基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 2....基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。 3....菱形继承 菱形继承是多继承的一种特殊情况。菱形继承具有数据冗余和二义性的问题。 如下图所示,Assistant对象中Person成员会有两份。...支持多继承就不可避免的会有菱形继承,Java就直接不支持多继承以避免菱形继承的问题,所以在实践中不建议设计出菱形继承的模型。...术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。

    7810

    【C++】继承

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

    71010

    C++继承

    1.继承方式的区别总结 (1)继承的方式有三种,分别是公有继承,私有继承,以及受保护的继承; (2)基类的私有成员无论是是使用何种方式继承,在派生类里面和外面都是不可以进行访问的;但是如果像这个基类的公有成员被私有继承...public继承,其他的这个继承组合我们了解即可,一般也是不会使用到的; (4)继承里面就发挥了保护成员的作用,我们之前在学习这个类和对象的时候还看不出来这个保护成员和私有成员的区别,这个时候我们就可以发现...public继承方式是可以省略的,但是如果我们不写出来,这个继承方式就会被默认为是私有的,但是如果是使用的struct表示的,这个默认方式就是公有继承,这个也是class和struct之间的一个区别;...,我们再进行这个继承类的书写的时候,还是建议把这个继承的方式标注出来; 2.赋值兼容性规则 (1)什么是赋值兼容性规则,这个规则是指的父子之间的兼容性规则,我们也称之为切割或者是切片,后面你就会明白为什么会这样起名字...这个地方仅仅是作为一个铺垫,我们知道这个子类继承了父类的相关的成员变量和成员函数,所以构造的时候是先构造父类,再构造子类,否则子类是没有办法去继承父类的成员函数和成员变量的,而我们更清楚的就是,析构函数和构造函数的执行顺序是相反的

    6610
    领券