公有继承(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. 基类成员对派生类对象的可见性:所有成员都是不可见的。

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

对于保护继承方式

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

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

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

代码说明:

#include <iostream>
using namespace std;
class A //父类
{
private:
int privatedateA;
protected:
int protecteddateA;
public:
int publicdateA;
};
///////////////////////////////////////////////////////
class B : public A //基类A的派生类B(公有继承)
{
public:
void func()
{
int b;
//b=privatedateA; //error:基类中私有成员在派生类中是不可见的
b=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
b=publicdateA; //ok:基类的公有成员在派生类中为公有成员
}
};
//////////////////////////////////////////////////////
class C : private A
{
public:
void func()
{
int c;
//c=privatedateA; //error:基类中私有成员在派生类中是不可见的
c=protecteddateA; //ok:基类的保护成员在派生类中为私有成员
c=publicdateA; //ok:基类的公有成员在派生类中为私有成员
}
};
//////////////////////////////////////////////////////
class D : protected A
{
public:
void func()
{
int d;
//d=privatedateA; //error:基类中私有成员在派生类中是不可见的
d=protecteddateA; //ok:基类的保护成员在派生类中为保护成员
d=publicdateA; //ok:基类的公有成员在派生类中为保护成员
}
}; int main()
{
int a; B objB;
//a=objB.privaredateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
//a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a=objB.publicdateA; //ok:基类的公共成员在派生类中为公共成员,对对象可见 C objC;
//a=objC.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
//a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
//a=objC.publicdateA; //error:基类的公有成员在派生类中为私有成员,对对象不可见 D objD;
//a=objD.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
//a=objD.protecteddateA; //error:基类中保护成员在派生类中是保护成员,对对象不可见
//a=objD.publicdateA; //error:基类中公有成员在派生类中是保护成员,对对象不可见
  return 0;
}

目录

  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. awk函数实现将简化IPV6地址补全

    在用awk处理文本时,有些场景需要将简化的IPV6地址补充成完整的IPV6地址,下边函数可简单实现: IPV6地址补全函数 # ipv6地址补全函数 function compipv6(orig_ad ...

  2. WEB前后端约定接口

  3. Nginx做代理

    0 查看日志 tail -f /var/log/nginx/access.log 1 Nginx代理配置语法 1.Nginx代理配置语法 Syntax: proxy_pass URL; Default ...

  4. 读书小记--<态度>

    前言 前段时间再读了吴军老师的<态度>,分享的是和女儿的日常书信.觉得收获很多,同时推荐他的<浪潮之巅><数学之美><大学之路>系列书籍. 下面是个人的 ...

  5. Python(四)生成器 和 杨辉三角

    学习链接: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143177992 ...

  6. 【C语言】输入5个整数并按输入顺序逆序输出

    #include <stdio.h> int main() { ],i; printf("请输入5个整数:\n"); ;i<;i++) scanf("% ...

  7. LVS+Keepalived -----> 效率最高的负载均衡器

    一. 简介  1. 负载均衡的类型  负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载 软件负 ...

  8. 连接数据库报错Access denied for user 'root'@'localhost' (using password:YES)

    报错信息为:pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pa ...

  9. 惠普笔记本,如何选择U盘启动

    开机先连续点击键盘F9按键进入选择启动盘界面,找到自己的U盘(KingstonDataTraveler G3)

  10. SpringBoot基于数据库的定时任务实现

    在我们平时开发的项目中,定时任务基本属于必不可少的功能,那大家都是怎么做的呢?但我知道的大多都是静态定时任务实现. 基于注解来创建定时任务非常简单,只需几行代码便可完成.实现如下: @Configur ...