C++ 类的继承(Inheritance)
一、继承(Inheritance)
C++有一个很好的性质称为inheritance(继承),就是声明一个class(derived class),把另一个或多个class(base class)的所有内容(包括data members和member function)统统继承下来(有无存取权限是另一回事)。如果直接继承自一个base class ,称为单一继承;如果直接继承自一个以上的class,称为多重继承。语法如下(以下是三层单一继承):
1 class CPoint
2 {
3 public:
4 CPoint(float x=0.0):_x(x){}
5 float x() {return _x;}
6 void x(float xval){_x=xval;}
7 protected:
8 float _x;
9 };
10
11 class CPoint2d:public CPoint{
12
13 public:
14 CPoint2d(float x=0.0,float y=0.0):CPoint(x),_y(y){}
15
16 float y(){return _y;}
17 void y(float yval){_y=yval;}
18 protected:
19 float _y;
20 };
21
22 class CPoint3d:public CPoint2d{
23 public:
24 CPoint3d(float x=0.0,float y=0.0,float z=0.0) :CPoint2d(x,y),_z(z){}
25 float z(){return _z;}
26 void z(float zval){_z=zval;}
27
28 protected:
29 float _z;
30
31
32 };
然后我们可以这样使用它们:
1 CPoint3d aPoint3d(1.1, 2.2, 3.3);
2 cout << "x = " << aPoint3d.x() << endl; // 1.1
3 cout << "y = " << aPoint3d.y() << endl; // 2.2
4 cout << "z = " << aPoint3d.z() << endl; // 3.3
5 CPoint3d* pPoint3d = new CPoint3d(4.4, 5.5, 6.6);
6 pPoint3d->x(4.1); // x() 是 CPoint's member function
7 pPoint3d->y(5.2); // y() 是 CPoint2d's member function
8 pPoint3d->z(6.3); // z() 是 CPoint3d's member function
9 cout << sizeof(CPoint) << endl; // 4
10 cout << sizeof(CPoint2d) << endl; // 8
11 cout << sizeof(CPoint3d) << endl; // 12
我们在CPint3d object中使用继承而来的x() 和y()函数,这两个函数将存取继承而来的_x和 _y数据。继承的最大用意,在于表现对象世界中is a kind of(或说is a)的关系。以本例CPoint3d object为例,其结构示意图如下:

C++语言支持三种继承:
1.单一继承(single Inheritance):direct base class只有一个。
2.多重继承(Multiple Inheritance):direct base class不只一个。
3.虚拟继承(Virtual Inheritance):多重继承之下,让共同的“祖父级”base class object能够被共享,不至于浪费内存空间。
二、单一继承(single Inheritance)
所谓单一继承,就是每一个class的driectly base class 只能有一个,继承的层级数目并没有限制。上例的CPoint、CPoint2d、CPoint3d一脉相传就是一种单一继承:


三、多重继承(Multiple Inheritance)
所谓多重继承,就是每一个class的driectly base class 不只一个,多重继承的语法如下:


四、虚拟继承(Virtual Inheritance)
所谓虚拟继承,就是在class head中,于base class的前方加上virtual关键字,如下所示:


五、继承体系下的对象构造和析构
1.继承体系下的对象构造顺序是:先内后外,先上后下;
CPoint's constructor. // 先建构 CPoint subobject
CPoint2d's constructor. // 再建构 CPoint2d subobject
CPoint3d's constructor. // 最后建构 CPoint3d object
2.继承体系下的对象析构顺序是:先外后内,先下后上;
CPoint3d's destructor. // 先析构 CPoint3d 外围部份
CPoint2d's destructor. // 再析构 CPoint2d 部份
CPoint's destructor. // 最后析构 CPoint 部份
C++ 类的继承(Inheritance)的更多相关文章
- [置顶] c++类的继承(inheritance)
在C++中,所谓"继承"就是在一个已存在的类的基础上建立一个新的类.已存在的类(例如"马")称为"基类(base class )"或&quo ...
- Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合.其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Poly ...
- Java+7入门经典 - 6 扩展类与继承 Part 1/2
第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...
- Java+7入门经典 - 6 扩展类与继承 Part 2/2
6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...
- JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 15 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- python-day6面向对象、类的继承
@面向对象三大特性:封装encapsulation.继承inheritance.多态(一个接口,多个实现)polymorphism. @面向对象介绍http://www.cnblogs.com/ale ...
- python 全栈开发,Day117(popup,Model类的继承,crm业务开发)
昨日内容回顾 第一部分:权限相关 1. 权限基本流程 用户登录成功后获取权限信息,将[权限和菜单]信息写入到session. 以后用户在来访问,在中间件中进行权限校验. 为了提升用户体验友好度,在后台 ...
- 模块的封装之C语言类的继承和派生
[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...
- Python的程序结构[2] -> 类/Class[1] -> 基类与继承
基类与继承 / Base Class and Inheritance Class 面向对象的特性使得 Python 中不可避免地需要使用到类和类的继承,类的继承可以使得代码很好的被重用.下面以一些代码 ...
- 对C++类的继承和派生的理解
C++中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产. 1.继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程. ...
随机推荐
- Linux服务器定时器
网络程序需要处理的第三类事件是定时事件,比如定期检测一个客户连接的活动状态.服务器程序通常管理着众多定时事件,因此有效地组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器 ...
- 学习Source Generators之IncrementalValueProvider
前面我们使用了IIncrementalGenerator来生成代码,接下来我们来详细了解下IIncrementalGenerator的核心部分IncrementalValueProvider. 介绍 ...
- 11 JavaScript关于时间
11 JavaScript关于时间 获取js的时间使用内置的Date函数完成 var d = new Date(); // 获取系统时间 // var d = new Date('2023-08-15 ...
- #链表#CF706E Working routine
题目 给出一个 \(n*m\) 的矩阵,每次交换两个等大的矩阵,输出 \(q\) 次操作后的矩阵 分析 维护向右和向下的指针,考虑最后输出只需要从每行的头指针向右跳, 那么修改实际上是将矩阵左边一列. ...
- #数学期望,状压dp,记忆化搜索#nssl 1468 V
分析 赛时写了个\(O(n!)\)的纯暴力,其实我现在才发现\(O(n!)\)的暴力一般都能用\(O(n2^n)\)的状压dp解决 但是其实不是每个状态都能被访问到,所以若\(n\)过大,用\(map ...
- C 语言文件读取全指南:打开、读取、逐行输出
C 语言中的文件读取 要从文件读取,可以使用 r 模式: FILE *fptr; // 以读取模式打开文件 fptr = fopen("filename.txt", "r ...
- Docker学习路线5:在 Docker 中实现数据持久化
Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离.默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失.为了解决这个问题并在容器生命周期内保留数据,Doc ...
- Go 语言函数、参数和返回值详解
函数是一组语句,可以在程序中重复使用.函数不会在页面加载时自动执行.函数将通过调用函数来执行. 创建函数 要创建(通常称为声明)一个函数,请执行以下操作: 使用 func 关键字. 指定函数的名称,后 ...
- 《深入理解Java虚拟机》读书笔记:HotSpot的算法实现
HotSpot的算法实现 HotSpot的算法实现概要 1.枚举根节点 由于目前的主流Java虚拟机使用的都是准确式GC(这个概念在第1章介绍Exact VM对Classic VM的改进时讲过),所以 ...
- Bash下切换conda环境
背景:很多时候实验命令都是基于Linux系统的,但是很多人的电脑是window系统的. 使用git自带的Bash可以运行linux命令,不过有时候在bash中想使用conda环境的时候比较麻烦,具体做 ...