- 共有继承 / 保护继承 / 私有继承 访问控制符 : 访问控制符 用于 设置 继承的方式 ; public : 公有继承 Child 类继承了 Parent 类的所有公有和保护成员 , 访问级别不变..., 并且可以访问它们 ; Child 类不能继承 Parent 类的私有成员 ; protected : 保护继承 Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为...保护成员 , 只能在类内部 或 子类中 访问它们 ; Child 类不能继承 Parent 类的私有成员 ; private : 私有继承 Child 类继承了 Parent 类的所有公有和保护成员..., 这些成员会被声明为私有的 , 只能在类内部访问它们 ; Child 类不能继承 Parent 类的私有成员 ; 3、继承与父类私有成员 C++ 的 三种继承 公有继承 public 保护继承 protected...私有继承 private 只针对 父类 的 " 公有成员 " 和 " 保护成员 " , 这两种成员是可以被继承的 ; 父类的 " 私有成员 " 是无法被子类 继承 和 访问 的 ; 父类的 私有成员
// 保护继承 子类中仍是 保护成员 , 不可在类外部访问 //child.b; 访问 私有变量 c : 基类中的私有成员 , 保护继承 子类中仍是 私有成员 , 不可在类外部访问 ;...按任意键继续向后执行 system("pause"); return 0; } 三、private 私有继承 - 示例分析 ---- 1、private 私有继承 private 私有继承 : 父类成员.../ 私有继承 子类中 的私有成员 , 不可在类外部访问 //child.a; 访问 保护变量 b : 基类中的保护成员 , 私有继承 子类中变为子类的 保护成员 , 不可在类外部访问 ;..., 私有继承 子类中仍是 父类的私有成员 , 不可在类外部访问 ; // 不可访问 : 基类中的私有成员 // 私有继承 子类中仍是 私有成员 , 不可在类外部访问 //child.c...// 私有继承 子类中 的私有成员 , 不可在类外部访问 //child.a; // 不可访问 : 基类中的 保护成员 变为 派生类 私有成员 // 私有继承 子类中
1.派生类间接访问基类私有成员 在类的继承中,基类私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。...2.私有成员会被继承吗 如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?...其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。...综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[8.1节]
1.派生类间接访问基类私有成员 在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。...在派生类还是能够通过调用基类的共有函数的方式来间接地访问基类的私有成员,包括私有成员变量和私有成员函数。考察如下程序。...2.私有成员会被继承吗 如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?...其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。...综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。
一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。...在关键字protected后面声明,与private类似,其差别表现在继承与派生时对派生类的影响不同 (三)、公有/私有/保护继承 ?...实现继承,对于私有、保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承。...如果不属于上述的情况,则是一般的继承,则使用一般的访问语法即可。 二、用C++设计一个不能继承的类 在Java中定义了关键字final,被final修饰的类不能被继承。...要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。
访问限定符与继承关系 在学习继承方式之前,我们得将这些访问限定符了解透,他们分别是 public(公有)、private(私有)、protected(保护)。...继承与友元 友元关系不能继承,也就是说 父类友元不能访问子类私有和保护成员! 相当于你爹的朋友不一定是你的朋友!...C++不能容忍数据冗余和二义性,于是提出了一个解决方案: 虚继承(virtual) 2.通过虚继承解决菱形继承问题 方案:在类腰部位置加一个 virtual 关键字: 注意: 虚继承的 virtual...继承的总结和反思 很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。...多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 虽然虚继承解决了菱形继承的坑,但是也付出了一定的代价: 对象模型更加复杂,学习成本更高了 有一定的效率影响
继承关系和访问限定符 继承基类成员访问方式的变化 记忆方法:基类的私有成员,无论哪种方式继承,在派生类中都是不可见。基类其他成员在子类的访问方式,取基类成员的访问限定符和继承方式中小的一个。...在继承中,一般用公有和保护,少用私有。 总结: 基类private成员在派生类中无论以什么方式继承都是不可见的。...可以看出保护成员限定符是因继承才出现的。 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...注意:必须是公有继承才可以,保护和私有都不行。 public继承是is -a的关系,即每个子类对象都是一个特殊的父类对象。 派生类对象可以赋值给 基类的对象 / 基类的指针 / 基类的引用。...继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 。 继承与静态成员 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。
这篇文章开始,我们来学习一下C++中的继承。 1. 继承的概念及语法 相信大家对于继承这个词应该都不陌生,所以在这篇文章的学习之前,大家可以先联想一下现实生活中的继承是怎么样的。...C++里面呢也有继承的概念,那C++的继承我们该如何去理解呢? 1.1 继承的概念 其实不仅在C++这门语言里有继承的概念,大多数面向对象的语言都支持继承。...相信说到这里,大家对于C++中继承的概念已经有了一定的理解了,那继承的语法是怎样的呢?我们如何去定义一个继承类呢?...因为是在子类中不可见,虽然被继承到了子类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 他跟私有不一样,如果是私有,至少在类里面还可以访问。...继承与友元 友元关系不能继承,也就是说父类的友元不是子类的友元,不能访问子类私有和保护成员。
; 在c++中将继承的一方称作派生类或者子类,将被继承的一方叫做基类或者父类继承的基本格式如下(CB 继承CA): class CA { public: CA(); ~CA(); }...:共有继承、私有继承以及保护继承,继承的方式不同,派生类对于基类的各种不同属性之间成员的访问权限不同,下面再给出一个表格用以说明这个问题: 通过这个表我们可以总结出一下几点: 1)私有成员在任何情况下都不能被派生类访问...; 2)公有继承下其他基类成员在派生类中的访问属性不变; 3)私有继承下其他基类成员在派生类中全部变为私有; 4)保护继承下其他类成员在派生类中全部变为保护属性; 从这个表中我们可以看出,私有继承与保护继承对于基类的访问属性完全相同...,我们知道基类的非私有成员在保护继承下公有的变为保护,保护的仍然为保护,而私有继承则是将所有都变为私有,他们之间如果都是保护继承的方式,那么CA中的其他成员在CB中都变为保护类型那么在CC中仍然能够访问到...CA的成员;当他们之间都是以私有继承的方式,那么CA中的成员在CB中都为私有,在CC中就不能访问CA中的成员,所以在一般情况下,我们将基类的数据成员声明为保护类型,这样既起到了封装的作用,又方便派生类的访问
这是EasyC++系列的第84篇,来聊聊私有继承。 私有继承(二) 我们继续来看私有继承。 访问基类方法 我们知道,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。...我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象。 这个概念我们很好理解,但具体到实现上,我们如何在派生类的方法当中调用基类的公有或者保护方法呢?...由于Student类只是继承了string类并没有自己的string实例,因此我们需要返回基类对象本身。 同样,我们怎么操作呢? 答案是使用强制转换。...引用不会自动发生转换,是因为在私有继承当中,在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类的引用或指针。 那么问题来了,如果我们使用的是公有继承,那么是不是就可以了呢?...其次由于C++支持多继承,所以编译器将会无法确定转换成哪个基类的类型。因此还是需要我们手动进行强制类型转换。
这是EasyC++系列的第83篇,来聊聊私有继承。 私有继承 我们可以将一个类作为另外一个类的成员,这样可以描述has-a的关系,即包含关系。...这里的valarray是C++中的一个模板类,它可以理解成一个泛型的数组,有些类似于vector和array,但提供的功能更多。比如拥有min, size, max, sum等方法。...除了使用成员变量来描述has-a关系之外,我们还可以使用私有继承。 在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。...语法 首先我们来看看私有继承的语法,其实和共有继承类似,只不过将public关键字替换为private,另外由于继承关系默认为private,所以也可以不填。...我们的构造函数签名可以这么写: Student(const string& n, const double *pd, int n): name(n), scores(pd, n) {} 但我们这个例子当中用的是私有继承
会经常用到(不然也不会作为 面向对象三大特性 之一了) 比较经典的例子:C++ 中的 IO 流玩的就继承,并且还是菱形继承 ---- 2、继承的定义 了解完继承相关概念后,就可以开始学习使用继承了...,而 C++ 中为 : 2.2、权限 继承有权限的概念,分别为:公有继承(public)、保护继承(protected)、私有继承(private) 没错,与 类 中的访问 限定修饰符 一样,不过这些符号在这里表示...在父类中设计相应的函数,获取私有成员的值进行间接访问即可 其实 C++ 中搞这么多种情况(9种)完全没必要,实际使用中,最常见到的组合为 public : public 和 protected : public...单继承:一个子类只能继承一个父类 多继承:一个子类可以继承多个父类(两个及以上) C++ 支持多继承,即支持一个子类继承多个父类,使其基础信息更为丰富,但凡事都有双面性,多继承 在带来巨大便捷性的同时...,最后还学习了多继承模式中容易引发的菱形继承问题,探究了其原因及解决方法,关于继承是如何辅助实现多态的,可以期待下篇文章:C++【多态】 ----
可以看出保护成员限定符是因继承才出现的。 3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...七、复杂的菱形继承及菱形虚拟继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况。... 1、很多人说C++语法复杂,其实多继承就是一个体现。...有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。...2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3.
C++中的继承 继承概念与定义 概念 定义 基类与派生类对象的赋值转换 继承中的作用域 成员同名 函数同名 派生类的默认成员函数 继承与友元 继承与静态成员 多继承 菱形继承 虚继承 虚继承的原理...这时候C++就提供了一种语法叫做继承。 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。...派生类的protected成员 派生类的protected成员 派生类的private成员 基类的private成员 在派生类中不可见 在派生类中不可见 在派生类中不可见 1.这里的不可见是指基类的私有成员还是被继承到了派生类对象中...2.那么基类的成员又不想被外面访问,又想继承到子类,这个时候父类的内容就要用保护了,也可以看得出保护是因此而出现的,之前保护和私有是没什么去别的。...继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。
,采用公有继承最为常见,几乎很少使用私有和保护继承。...但只要有多继承的存在,就会出现菱形继承,而菱形继承就是C++继承的一个大坑,Java知道C++因为有了多继承之后,出现菱形继承的大坑,所以Java为了避免菱形继承的大坑,规定Java只能有单继承不能有多继承...C++为了解决菱形继承带来的问题采用了虚拟继承的方式来进行解决,即在菱形继承的腰部位置采用virtual继承来解决菱形继承的大坑。 5....在菱形虚拟继承之后,存储的逻辑模型也变为下方所示。 //C++引入虚拟继承来解决菱形继承的数据冗余和二义性问题。...多继承可以认为是C++的一个大坑,所以很多后来产生的语言都没有多继承,只允许单继承的存在,例如Java.继承和组合都是代码复用的一种手段。 2.
这是EasyC++系列的第85篇,私有继承的最后一篇。 私有继承(三) 通过私有继承,我们可以实现一种has-a的关系。...根据C++ Primer中的阐述,大多数程序员会更倾向于使用包含,因为这更加容易理解。类声明当中包含对象,我们可以在成员函数当中直接使用,这显然更加直观,而使用继承的方式则非常地抽象。...保护继承 保护继承是私有继承的变体,保护继承在列出基类时使用关键字protected: class Student : protected std::string, protected std::valarray...和私有继承一样,基类的接口在派生类当中也是可用的,但在继承层次结构之外是不可用的。当我们从派生类继续派生出第三代类的时候,私有继承和保护继承的区别就出来了。...使用私有继承时,第三代类不能使用基类的接口,因为基类的公有方法在派生类当中变成了私有方法。而使用保护继承的话,基类的公有方法在派生类变成受保护的,所以第三代派生类依然可以使用。
首先,Java官方文档中明确表示私有成员【即私有属性(field)和私有方法(method)】不会被继承。...name);} } 总结下上面的例子: 子类的内存中出现了父类的属性 虽然子类不能直接操作父类属性,但是可以通过间接的方式操作(父类提供的公共方法、super方法或者反射) 以次可以推断出,子类确实是继承了父类的私有成员的...即:子类不会继承其父类的私有成员。但是,如果父类中具有能访问其私有字段的public或project修饰的方法,则子类也可以使用这些方法获取其私有成员。...自然是内存中,这也是为什么子类的内存中可以看到父类的私有成员; 但是由于封装性的原理,私有成员只能在自己的类中使用,所以子类是无法在自己的类中使用父类的私有成员的,既然无法使用,那我说他没有继承,也没什么问题吧...; 这不就完美体现了继承性吗,所以再回到刚才那句Java官方文档对继承性就很合理了。
派生类可以访问基类中所有的非私有成员。...我们几乎不使用 protected 或 private 继承,通常使用 public 继承。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。...C++ 类可以从多个类继承成员,语法如下: class :,,… { }; 其中,访问修饰符继承方式是 public、protected
可以看出保护成员限定符是因继承才出现的 。 3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...(注:c++标准没有明确规范派生类对象在内存中如何分配,但是我们可以认为是如图分配的,在一个对象中,继承自基类的部分和派生类自定义的部分不一定是连续存储的)。...,也就是说基类友元不能访问子类私有和保护成员。...8.2总结 1.很多人说 C++ 语法复杂,其实多继承就是一个体现。有了多继承 ,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。...所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。 2. 多继承可以认为是 C++ 的缺陷之一,很多后来的 OO 语言都没有多继承,如 Java 。
Contents 1 基本概念 2 访问控制和继承 3 继承类型 4 多继承 5 参考资料 基本概念 面向对象程序设计一个重要的概念就是继承。继承允许我们依据另一个类来定义一个类。...派生类可以访问基类中所有的非私有成员。...protected Shape; 我们几乎不使用 protected 或 private 继承,通常使用 public 继承。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,继承了多个父类的成员变量和函数。
领取专属 10元无门槛券
手把手带您无忧上云