C++继承(一) 三种继承方式
继承定义
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。
继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。
一般格式如下:
class 派生类名 : 继承类型 基类名
派生类成员可以访问基类的public成员和protected成员。
三种继承方式
继承类型有三种,共有继承(public),私有继承(private)和保护继承(protected)。
共有继承:
共有继承的特点是基类成员在派生类中都保持原来的状态
- 基类中的public仍为public,
- 基类中的protected仍为protected,
- 基类中的private仍为private;
私有继承:
私有继承的特点是基类中所有成员在派生类中都变为私有成员
- 基类中的public,protected变为private,
- 基类中的private仍为private;
保护继承:
- 基类中的public变为protected,
- 基类中的protected仍为protected,
- 基类中的private仍为private;
private在派生类中依然存在,但不论以哪种方法继承基类,派生类都不能直接访问基类的私有成员。
| 继承方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 |
|---|---|---|---|
| public继承 | public成员 | protected成员 | private成员 |
| protected继承 | protected成员 | protected成员 | private成员 |
| private继承 | private成员 | private成员 | private成员 |
for example:
class Base { //基类
public :
int pub;
private:
int pri;
protected :
int pro;
};
class A : public Base{ //public继承
public :
int a;
void init() {
a = pub; //可以,依然为public成员
a = pro; //可以,依然为protected成员
a = pri; //错误,基类的私有成员在派生类中是不可见的
}
};
class B : protected Base{ //protected继承
public :
int b;
void init() {
b = pub; //可以,变为protected成员
b = pro; //可以,依然为protected成员
b = pri; //错误,基类的私有成员在派生类中是不可见的
}
};
class C : private Base{ //private继承
public :
int c;
void init() {
c = pub; //可以,变为private成员
c = pro; //可以,变为private成员
c = pri; //错误,基类的私有成员在派生类中是不可见的
}
};
int x;
A a;
x = a.pub; //可以,public继承的public成员是public的,对对象可见
x = a.pro; //错误,public继承的protected成员是protected的,对对象不可见
x = a.pri; //错误,public继承的private成员是private的,对对象不可见
B b;
x = b.pub; //错误,protected继承的public成员是protected的,对对象不可见
x = b.pro; //错误,protected继承的protected成员是protected的,对对象不可见
x = b.pri; //错误,protected继承的private成员是private的,对对象不可见
C c;
x = c.pub; //错误,protected继承的public成员是private的,对对象不可见
x = c.pro; //错误,protected继承的protected成员是private的,对对象不可见
x = c.pri; //错误,protected继承的private成员是private的,对对象不可见
return 0;
- public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。
- protetced/private继承是一个实现继承,基类的部分成员并非完全成为子类接口的一部分,是has-a的关系原则,所以非特殊情况下不会使用这两种继承关系,在绝大多数的场景下使用的都是公有继承。
- class的默认继承是private的,struct的默认继承是public的。
C++继承(一) 三种继承方式的更多相关文章
- C++中的类继承(1) 三种继承方式
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...
- C++的三种继承方式简述
C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- c++三种继承方式public,protect,private
C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...
- mfc 类三种继承方式下的访问
知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...
- C++三种继承方式
一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.
- c++中三种继承方式的区别
public公有继承 protected保护继承 private私有继承 我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用. 公有继承时 ...
- C++ 中三种继承方式的理解
一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下: 我们用代 ...
- C++中的三种继承方式
1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...
随机推荐
- HTML文档命名规则
HTML文档是展示Web前段开发工程师成果的最好表示方式,为了便于文档规范化管理,在编写HTML文档时,必须遵循HTML文件命名规则. HTML文档命名规则如下: (1)文档的扩展名为htm或者htm ...
- 20190329-盒尺寸、boder-
目录 1.盒尺寸四家庭 width:宽度 height:高度 margin:外边距 padding:内边距 盒模型: 2.border边框 border简写:border-position(top | ...
- wordpress 图片上传冲突
网上常见的wordpress图片上传 jQuery('#upload_image_button').click(function() { //formfield并未用上,可能代码遗漏了一段,怀疑和类的 ...
- QT中使用google breakpad捕获程序崩溃异常
今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...
- matlab中的实时音频
音频系统工具箱™针对实时音频处理进行了优化.audioDeviceReader, audioDeviceWriter, audioPlayerRecorder, dsp.AudioFileReader ...
- 测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和解决方法
今天遇见了一个奇怪的问题,在IDE中run unit test,全部cases都成功了,但是后来通过mvn test运行case确保错了.在寻求原因的同时也找到了对应的解决方法. Run Unit T ...
- 如何知道一个EXE使用什么开发语言开发的
一般是看EXE调用哪些DLL,这可以使用VC++中的工具Dependency Walker,它可以列出静态链接的所有DLL. 如果EXE中的DLL包括MSVBVM60.DLL,则是使用VB 6.0开发 ...
- SQL优化小技巧
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. 1.使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析 ...
- SQLServer修改登陆账户信息
修改登陆账户信息注意事项 如果 CHECK_POLICY设置为ON,则无法使用 HASHED参数. 如果 CHECK_POLICY更改为ON,则将出现以下行为: 用当前的密码哈希值初始化密码历史记录. ...
- LNMP环境下部署搭建wordpress
1. 下载WordPress安装包 访问官方网站https://cn.wordpress.org/ 点击Download.tar.gz下载linux平台安装包 2. 安装软件 2.1.上传安装包 使用 ...