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)可以理解为一个类从另一个类获取成员变量和成员函数的过程. ...
随机推荐
- LiftPool:双向池化操作,细节拉满,再也不怕丢特征了 | ICLR 2021
论文参考信号处理中提升方案提出双向池化操作LiftPool,不仅下采样时能保留尽可能多的细节,上采样时也能恢复更多的细节.从实验结果来看,LiftPool对图像分类能的准确率和鲁棒性都有不错的提升,而 ...
- #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
题目 支持区间加和区间查询第 \(k\) 小 分析 分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是 \(O(\sqrt{n})\) 的 查询的话,如果 ...
- #交互,栈#LOJ 3005 「JOISC 2015 Day 4」Limited Memory
题目 分析 一开始想的是栈的匹配,但是位数不够,而且还忘记写memory.h, 考虑它询问次数不超过一万五千次,\(O(n^2)\)的询问是绰绰有余的, 如果每一个符号都能被匹配那整个串也能被匹配,而 ...
- Python 变量:创建、类型、命名规则和作用域详解
变量 变量是用于存储数据值的容器. 创建变量 Python没有用于声明变量的命令. 变量在您第一次为其分配值时被创建. 示例 x = 5 y = "John" print(x) p ...
- C++执行Linux命令
一.执行简单命令 比如需要创建文件.文件夹.删除文件 #include <iostream> #include <stdio.h> #include <stdlib.h& ...
- openGauss数据库将磁盘表转换为MOT
openGauss 数据库将磁盘表转换为 MOT 一.将磁盘表转换为 MOT 方法 磁盘表直接转换为 MOT 尚不能实现,这意味着尚不存在将基于磁盘的表转换为 MOT 的 ALTER TABLE 语句 ...
- MogDB/openGauss中merge的语法解析
MogDB/openGauss 中 merge 的语法解析 近期了解学习了 MogDB/openGauss 中 merge 的使用,merge 语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成 ...
- 《深入理解Java虚拟机》读书笔记: 虚拟机类加载的时机和过程
虚拟机类加载的时机和过程 一.类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation ...
- Linux之parted
[摘要] parted用于对磁盘(或RAID磁盘)进行分区及管理,与fdisk分区工具相比,支持2TB以上的磁盘分区,并且允许调整分区的大小. 使用它你可以创建.清除.调整.移动和复制ext2.ext ...
- mysql 必知必会整理—触发器[十五]
前言 现在很多都是程序用于触发的,而不是触发器了. 正文 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行, ...