公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

1. 公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

2. 私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

3. 保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

下面列出三种不同的继承方式的基类特性和派生类特性。

  public proteced private
公有继承 public protected 不可见
私有继承 private private 不可见
保护继承 protected protected 不可见

在上图中:

  1. 基类成员对派生类都是:公有和保护的成员是可见的,私有的的成员是不可见的。
  2. 基类成员对派生类的对象来说:要看基类的成员在派生类中变成了什么类型的成员。如:私有继承时,基类的公有成员和保护成员都变成了派生类中的私有成员,因此对于派生类中的对象来说基类的公有成员和保护成员就是不可见的。

对于公有继承方式

  1. 基类成员对其对象的可见性:公有成员可见,其他不可见。这里保护成员同于私有成员。
  2. 基类成员对派生类的可见性:公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。
  3. 基类成员对派生类对象的可见性:公有成员可见,其他成员不可见。

  所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清除派生类的对象和派生类中的成员函数对基类的访问是不同的。

对于私有继承方式

  1. 基类成员对其对象的可见性:公有成员可见,其他不可见。
  2. 基类成员对派生类的可见性:公有成员和保护成员是可见的,而私有成员是不可见的。
  3. 基类成员对派生类对象的可见性:所有成员都是不可见的。

  所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

对于保护继承方式

  这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,对基类成员有不同可见性。

  上述所说的可见性也就是访问性。

  关于访问性还有另一种说法。这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。

代码说明:

  1. #include <iostream>
  2. using namespace std;
  3. class A //父类
  4. {
  5. private:
  6. int privatedateA;
  7. protected:
  8. int protecteddateA;
  9. public:
  10. int publicdateA;
  11. };
  12. ///////////////////////////////////////////////////////
  13. class B : public A //基类A的派生类B(公有继承)
  14. {
  15. public:
  16. void func()
  17. {
  18. int b;
  19. //b=privatedateA; //error:基类中私有成员在派生类中是不可见的
  20. b=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
  21. b=publicdateA; //ok:基类的公有成员在派生类中为公有成员
  22. }
  23. };
  24. //////////////////////////////////////////////////////
  25. class C : private A
  26. {
  27. public:
  28. void func()
  29. {
  30. int c;
  31. //c=privatedateA; //error:基类中私有成员在派生类中是不可见的
  32. c=protecteddateA; //ok:基类的保护成员在派生类中为私有成员
  33. c=publicdateA; //ok:基类的公有成员在派生类中为私有成员
  34. }
  35. };
  36. //////////////////////////////////////////////////////
  37. class D : protected A
  38. {
  39. public:
  40. void func()
  41. {
  42. int d;
  43. //d=privatedateA; //error:基类中私有成员在派生类中是不可见的
  44. d=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
  45. d=publicdateA; //ok:基类的公有成员在派生类中为保护成员
  46. }
  47. };
  48.  
  49. int main()
  50. {
  51. int a;
  52.  
  53. B objB;
  54. //a=objB.privaredateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  55. //a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
  56. a=objB.publicdateA; //ok:基类的公共成员在派生类中为公共成员,对对象可见
  57.  
  58. C objC;
  59. //a=objC.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  60. //a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
  61. //a=objC.publicdateA; //error:基类的公有成员在派生类中为私有成员,对对象不可见
  62.  
  63. D objD;
  64. //a=objD.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
  65. //a=objD.protecteddateA; //error:基类中保护成员在派生类中是保护成员,对对象不可见
  66. //a=objD.publicdateA; //error:基类中公有成员在派生类中是保护成员,对对象不可见
  67.   return 0;
  68. }

目录

  1. c++(翁恺浙大公开课) 笔记0
  2. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
  3. c++对象初始化(翁恺c++公开课[10])
  4. c++构造函数的初始化列表(翁恺c++公开课[13])
  5. c++继承:公有、私有、保护
  6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
  7. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
  8. c++多态性及多态的内部实现(翁恺c++公开课[23-24])
  9. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
  10. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
  11. c++模板(翁恺c++公开课[34-35]学习笔记)
  12. 最好不要在头文件中写函数定义

c++继承:公有、私有、保护(对应p12访问限制)的更多相关文章

  1. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  2. 公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  3. 【转】c++继承:公有、私有、保护

    原文链接:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html 公有继承(public).私有继承(private).保护继承(pro ...

  4. c++ 多继承 公有,私有,保护

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...

  5. C++公有继承,私有继承和保护继承的区别

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...

  6. c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承

    公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 ...

  7. C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承

    公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...

  8. C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...

  9. 【转】【Java】利用反射技术,实现对类的私有方法、变量访问

    java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...

随机推荐

  1. unittest 改装框架ascii 排序执行用例,按照自己书写先后顺序执行

    设计思路: 获取成员变量class.__dict__.keys() filter过滤符合要求成员,由于3.x成员dict属性是支持有序的 # coding=utf-8import unittestfr ...

  2. Sql性能优化梳理

    前言 先简单梳理下Mysql的基本概念,然后分创建时和查询时这两个阶段的优化展开. 1.0 基本概念简述 1.1 逻辑架构 第一层:客户端通过连接服务,将要执行的sql指令传输过来 第二层:服务器解析 ...

  3. 深度学习之反向传播算法(BP)代码实现

    反向传播算法实战 本文仅仅是反向传播算法的实现,不涉及公式推导,如果对反向传播算法公式推导不熟悉,强烈建议查看另一篇文章神经网络之反向传播算法(BP)公式推导(超详细) 我们将实现一个 4 层的全连接 ...

  4. 李超线段树(segment[HEOI2013]-洛谷T4097)

    (neng了好久好久才糊弄懂得知识点...) 一.李超线段树 在线动态维护一个二维平面直角坐标系, 支持插入一条线段, 询问与直线x = x0相交的所有线段中,交点y的最大/小值 (若有多条线段符合条 ...

  5. acm数论之旅--欧拉函数的证明

    随笔 - 20  文章 - 0  评论 - 73 ACM数论之旅7---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭) https://blog.csdn.net/chen_ze_hua ...

  6. 获取浏览器url参数

    //获取浏览器url参数 var methods ={ getQueryString: function (name) { var reg = new RegExp('(^|&)' + nam ...

  7. 移动端rem自适应方案

    一般设计师给我们的设计稿尺寸都为750*1340 .. 网易,淘宝移动端首页上html元素的font-size 目前就先说一下网易的做法 引入下面这段js,用于计算动态的font-size (func ...

  8. C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,

    //学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...

  9. TCP 连接建立分析

    tcp 三次握手与四次挥手 tcp 报文结构 tcp 是全双工的,即 client 向 server 发送信息的同时,server 也可以向 client 发送信息. 在同主机的两个 session ...

  10. LNMP环境搭建(PHP7.4.0)

    目录 准备工作 安装wget 安装net-tools 安装vim 配置显示行号 关闭防火墙 安装Nginx 安装依赖 编译安装Nginx 配置环境变量 Systemd管理 安装MySQL 安装依赖 下 ...