继承关系和访问限定符 继承基类成员访问方式的变化 记忆方法:基类的私有成员,无论哪种方式继承,在派生类中都是不可见。基类其他成员在子类的访问方式,取基类成员的访问限定符和继承方式中小的一个。 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 。 继承与静态成员 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。 复杂的菱形继承及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况。 如上面的继承关系,在Student和 Teacher的继承Person时使用虚拟继承,即可解决问题。 上图也是菱形继承,virtual要放在继承了公共基类的地方。 继承的总结和反思 一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。
多继承及其菱形继承问题 7.1 继承模型 单继承:⼀个派⽣类只有⼀个直接基类时称这个继承关系为单继承 多继承:⼀个派⽣类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前 很多⼈说C++语法复杂,其实多继承就是⼀个体现。 有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂,性能也会有⼀些损失,所以最好不要设计出菱形继承。 多继承可以认为是C++的缺陷之⼀,后来的⼀些编程语⾔都没有多继承,如Java。 当然有多继承语法⽀持,就⼀定存在会设计出菱形继承,像Java是不⽀持多继承的, 就避开了菱形继承。
七、复杂的菱形继承及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况。 1、很多人说C++语法复杂,其实多继承就是一个体现。 有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。 2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3. 不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。
会经常用到(不然也不会作为 面向对象三大特性 之一了) 比较经典的例子:C++ 中的 IO 流玩的就继承,并且还是菱形继承 ---- 2、继承的定义 了解完继承相关概念后,就可以开始学习使用继承了 ,而 C++ 中为 : 2.2、权限 继承有权限的概念,分别为:公有继承(public)、保护继承(protected)、私有继承(private) 没错,与 类 中的访问 限定修饰符 一样,不过这些符号在这里表示 单继承:一个子类只能继承一个父类 多继承:一个子类可以继承多个父类(两个及以上) C++ 支持多继承,即支持一个子类继承多个父类,使其基础信息更为丰富,但凡事都有双面性,多继承 在带来巨大便捷性的同时 在通过后者实现前者时,可以通过 组合,也可以通过 继承 ---- 总结 以上就是本次关于 C++【继承】的全部内容了,在本篇文章中,我们重点介绍了继承的相关知识,如什么是继承、如何继承、继承该注意些什么 ,最后还学习了多继承模式中容易引发的菱形继承问题,探究了其原因及解决方法,关于继承是如何辅助实现多态的,可以期待下篇文章:C++【多态】 ----
C++中的继承 继承概念与定义 概念 定义 基类与派生类对象的赋值转换 继承中的作用域 成员同名 函数同名 派生类的默认成员函数 继承与友元 继承与静态成员 多继承 菱形继承 虚继承 虚继承的原理 这时候C++就提供了一种语法叫做继承。 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。 3.继承方式也可以不写,使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。 多继承 一个类继承了多个个类,这就是多继承。 菱形继承 最麻烦的就是这种菱形继承,因为数据会冗余。 虚继承要在菱形继承中间的位置。
继承后派生类成员访问权限 继承方式的不同会使得继承后派生类成员访问权限不一样,简单来说,判断继承后派生类成员的访问权限是将继承方式与基类成员访问权限类型作比较,取权限小的那个。 _count << endl; return 0; } 多继承 单继承:一个派生类只继承了一个基类时,这个继承关系叫做单继承。 多继承:一个派生类继承了多个基类时,这个继承关系叫做多继承。 支持多继承就不可避免的会有菱形继承,Java就直接不支持多继承以避免菱形继承的问题,所以在实践中不建议设计出菱形继承的模型。 在Student和Teacher继承时使用虚拟继承,就可以解决菱形继承的问题。 不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合 相关笔试题 1.什么菱形继承?菱形继承的问题是什么?
这篇文章开始,我们来学习一下C++中的继承。 1. 继承的概念及语法 相信大家对于继承这个词应该都不陌生,所以在这篇文章的学习之前,大家可以先联想一下现实生活中的继承是怎么样的。 C++里面呢也有继承的概念,那C++的继承我们该如何去理解呢? 1.1 继承的概念 其实不仅在C++这门语言里有继承的概念,大多数面向对象的语言都支持继承。 相信说到这里,大家对于C++中继承的概念已经有了一定的理解了,那继承的语法是怎样的呢?我们如何去定义一个继承类呢? class B :public A //{ //}; //int main() //{ // //B b; // A::CreateObj(); // return 0; //} 下一篇文章,我们要讲一下C+ +中复杂的菱形继承及菱形虚拟继承,敬请期待…
; 在c++中将继承的一方称作派生类或者子类,将被继承的一方叫做基类或者父类继承的基本格式如下(CB 继承CA): class CA { public: CA(); ~CA(); } :共有继承、私有继承以及保护继承,继承的方式不同,派生类对于基类的各种不同属性之间成员的访问权限不同,下面再给出一个表格用以说明这个问题: 通过这个表我们可以总结出一下几点: 1)私有成员在任何情况下都不能被派生类访问 ; 2)公有继承下其他基类成员在派生类中的访问属性不变; 3)私有继承下其他基类成员在派生类中全部变为私有; 4)保护继承下其他类成员在派生类中全部变为保护属性; 从这个表中我们可以看出,私有继承与保护继承对于基类的访问属性完全相同 保护成员的访问情况与私有相同,即类的保护成员在类内可以访问在类外不能访问,它们二者的区别在这个表中确实没有体现出来,主要的区别可以在下一层的继承中体现比如有三个类继承关系为CC->CB->CA,继承类型分别为 ,我们知道基类的非私有成员在保护继承下公有的变为保护,保护的仍然为保护,而私有继承则是将所有都变为私有,他们之间如果都是保护继承的方式,那么CA中的其他成员在CB中都变为保护类型那么在CC中仍然能够访问到
但只要有多继承的存在,就会出现菱形继承,而菱形继承就是C++继承的一个大坑,Java知道C++因为有了多继承之后,出现菱形继承的大坑,所以Java为了避免菱形继承的大坑,规定Java只能有单继承不能有多继承 C++为了解决菱形继承带来的问题采用了虚拟继承的方式来进行解决,即在菱形继承的腰部位置采用virtual继承来解决菱形继承的大坑。 5. iostream就是C++用菱形继承设计出来的,但是也就大佬能用用了,如果我们自己用肯定得被别人骂死。因为有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。 在菱形虚拟继承之后,存储的逻辑模型也变为下方所示。 //C++引入虚拟继承来解决菱形继承的数据冗余和二义性问题。 多继承可以认为是C++的一个大坑,所以很多后来产生的语言都没有多继承,只允许单继承的存在,例如Java.继承和组合都是代码复用的一种手段。 2.
1.继承方式的区别总结 (1)继承的方式有三种,分别是公有继承,私有继承,以及受保护的继承; (2)基类的私有成员无论是是使用何种方式继承,在派生类里面和外面都是不可以进行访问的;但是如果像这个基类的公有成员被私有继承 ,这个时候基类的公有成员在派生类里面就是私有的,这个私有的成员在派生类里面是可以进行访问的,但是在派生类的外面是不可以进行访问的; (3)我们的这个继承方式的组合尽管是多种多样的,但是这个经常使用的就是 public继承,其他的这个继承组合我们了解即可,一般也是不会使用到的; (4)继承里面就发挥了保护成员的作用,我们之前在学习这个类和对象的时候还看不出来这个保护成员和私有成员的区别,这个时候我们就可以发现 ,我们的写法就是class student:public teacher这个就是大部分教材的写法,我们需要知道的就是这个public继承方式是可以省略的,但是如果我们不写出来,这个继承方式就会被默认为是私有的 ,但是如果我们使用struct去定义类的时候,我们里面的这个成员就会被默认为是公有成员; 即使如此,我们再进行这个继承类的书写的时候,还是建议把这个继承的方式标注出来; 2.赋值兼容性规则 (1)什么是赋值兼容性规则
(注:c++标准没有明确规范派生类对象在内存中如何分配,但是我们可以认为是如图分配的,在一个对象中,继承自基类的部分和派生类自定义的部分不一定是连续存储的)。 不过继承也有用武之地的,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用 继承,可以用组合,就用组合。 八、多继承,复杂的菱形继承和虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况 8.2总结 1.很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承 ,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。 所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。 2. 多继承可以认为是 C++ 的缺陷之一,很多后来的 OO 语言都没有多继承,如 Java 。
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 继承类型 当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。 C++ 类可以从多个类继承成员,语法如下: class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> }; 其中,访问修饰符继承方式是 public、protected
、菱形继承、虚继承 7.1多继承、菱形继承、虚继承的关系 继承分为单继承和多继承。 多继承可 以认为是C++的缺陷之⼀。 我们可以设计出多继承,但是不建议设计出菱形继承,因为菱形虚拟继承以后,⽆论是使⽤还是底层都会复杂很多。 答案肯定是否定的就连C++的库中也用了菱形继承。 例如:IO库中的菱形虚拟继承 八 继承和组合 • public继承是⼀种is-a的关系。也就是说每个派⽣类对象都是⼀个基类对象。 stack { public: vector<T> _v; }; int main() { return 0; } 本篇文章就到此结束,欢迎大家订阅我的专栏,欢迎大家指正,希望有所能帮到读者更好理解C+ +相关知识 ,觉得有帮助的还请三联支持一下~后续会不断更新C/C++相关知识,我们下期再见。
继承访问权限 父类public 父类protect 父类private public继承 public protect --- protect继承 protect protect --- private 继承 private private --- 先看继承的权限关键字,再看父类的成员变量声明关键字。 构造函数执行顺序 调用父类构造方法 调用组合类构造方法 调用本身的构造方法 析构函数执行顺序 与构造函数执行顺序相反 继承中同名成员变量 class A中有x ;class B集成A,同时也有x。 静态成员变量 遵循集成规则 使用前必须先定义 多继承产生的成员变量多义性 多个继承类继承自同一个祖先类,祖先类中的成员变量使用会产生二义性。如下: ? 多个继承类中有同名的成员变量 ? 2.png
C++中继承就提供了这种类层次的代码复用。 由于C++出现时间早,没有其他参考,因此设计者一开始考虑了所有的可能情况,因此出现了上表中的9种情况,但是在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用 很多人说C++语法复杂,其实多继承就是一个体现。 多继承可以认为是C++的缺陷之一,后来的一些编程语言都没有多继承,如Java。 为了处理数据冗余,C++设计了一个关键词virtual来解决,Assisant的冗余数据主要是Person有两份,一份来自Student,一份来自Teacher,那们我们就在Student与Teacher
前言 本篇博客我们来看一下C++里集成的概念,了解有关继承的一些基础知识 个人主页:小张同学zkf ⏩ 文章专栏:C++ 若有问题 评论区见 欢迎大家点赞收藏⭐文章 1.继承 1.1继承的概念 7.1继承模型 单继承:⼀个⼦类只有⼀个直接⽗类时称这个继承关系为单继承 多继承:⼀个⼦类有两个或以上直接⽗类时称这个继承关系为多继承,多继承对象在内存中的模型 是,先继承的⽗类在前⾯, 类之间的关系既适合⽤继承(is-a)也适合组合(has-a),就⽤组合。 • 很多⼈说C++语法复杂,其实多继承就是⼀个体现。 有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂,性能也会有⼀些损失,所以最好不要设计出菱形继承。 多继承可以认为是C++的缺陷之⼀,后来的⼀些编程语⾔都没有多继承,如Java。 结束语 C++继承的知识总结到这里,有了继承也就代表C++语言有了灵活性 OK,感谢观看!!!
继承 继承定义 1. C++面向对象有三大特性:封装、继承、多态。 2. 继承机制可以使代码重复使用,允许在保持原有类特性的基础上进行拓展,增加新的成员函数或者成员变量。 继承的格式 1. 下面我们看到Person是基类,也称作父类。Student是派生类,也称作子类。 2. 继承类的格式如下:class 派生类:继承方式 基类。 使用关键字class时默认的继承方式是private,使用关键字struct时默认的继承方式是public,不过最好显示的写出继承方式。 6. 友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员 。 继承与静态成员 1. 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。 单继承:一个派生类只有一个直接基类时称这个继承关系为单继承。 2. 多继承:一个派生类有两个或以上直接基类时称这个继承关系为多继承。 3. 会出现菱形继承,有数据冗余和二义性的问题。
一、什么是继承? 继承的概念 定义: 继承机制就是面向对象设计中使代码可以复用的重要手段,它允许在程序员保持原有类特性的基础上进行扩展,增加功能。 使用private默认的继承方式是private,使用struct的默认继承方式是public,但是我们在实际开发中最好还是写出继承方式。 六、菱形继承和虚拟继承 6.1. 菱形继承 单继承:一个子类只有一个直接父类的继承关系为单继承 多继承:一个子类有两个或以上直接父类。 菱形继承:就是继承关系近似呈一个菱形形状,如下图: 菱形继承会造成两个问题:数据冗余和二义性。 虚拟继承 为了解决数据二义性与冗余的问题,C++引入虚拟继承。虚拟继承用法十分简单,直接在继承前加上一个关键字:virtual。
复杂的菱形继承及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况 为了解决这个问题提出了虚继承。 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person时使用虚拟继承,即可解决问题。 多继承其实本身并没有什么问题,但是多继承就一定会可能写出菱形继承。 总之:在实践中可以设计多继承,但是切记不能设计菱形继承,因为太复杂了,容易出各种问题。 继承公共基类的叫做多继承。 8. 继承的总结和反思 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 继承和组合 (1)public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
Contents 1 基本概念 2 访问控制和继承 3 继承类型 4 多继承 5 参考资料 基本概念 面向对象程序设计一个重要的概念就是继承。继承允许我们依据另一个类来定义一个类。 继承类型 派生类可以有public、protected 或 private 几种类型。 protected Shape; 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。 当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,继承了多个父类的成员变量和函数。