c++中的继承关系
1 什么是继承
面向对象的继承关系指类之间的父子关系。用类图表示如下:

2 为什么要有继承?/ 继承的意义?
因为继承是面向对象中代码复用的一种手段。通过继承,可以获取父类的所有功能,也可以在子类中重写父类已有的功能 以及 添加父类中没有的功能。
3 如何理解 子类是特殊的父类?
因为子类不仅继承了父类所有的属性与行为,而且在子类中还可以重写父类已有的功能,以及添加自己的新属性与新方法。这也就是说子类对象可以当作父类对象使用。
4 继承的规则
1) 子类是特殊的父类
2) 子类对象可以直接初始化父类对象
3) 子类对象可以直接赋值给父类对象
5 继承中的访问级别
1)public:在类的内部和外部都可以访问。
2)protected::可以在类的内部使用,不可以在类的外部直接使用。,但是存在继承关系时,可以在子类中使用父类的protected的成员。
3)private:只可以在类的内部使用,不可以在类的外部使用。
注:类的内部:在当前类的作用域中(不包括子类的作用域);类的外部:类内部之外的作用域(包括子类的作用域)
问题1:子类是否可以直接访问父类中的private成员(非公有成员)吗?(No)
1)从面向对象理论的角度分析,可知子类拥有父类一切的属性与行为,得出的结论:Yes
2)从c++的语法角度分析,可知外界不能访问类的private成员,得出的结论:No
问题2:谈谈 protected关键字的存在的意义?
protected关键字是为继承而存在的,这样就可以在子类中访问父类的protected成员,同时还不允许外界直接访问父类中的protected成员。
问题3:在类中如何选择类的访问级别?--- 见下图

6 继承中的继承方式
1)public 继承方式 --- 父类成员在子类中保持原有的访问级别。
2)protected 继承方式 --- 父类中的公有成员在子类中变成了protected成员,其它不变。
3)private 继承方式(默认) --- 父类成员在子类中变成了private成员
可归纳为: 
结论:无论选择哪种继承方式,都不会影响子类访问父类成员的级别
注:1) c++ 工程项目中只使用 public 继承方式;
2) c++ 派生语言(jave,c#)只支持 public继承方式;
3)protected、private 继承方式带来的复杂性远大于其实用性;(舍弃不用)
用代码实现类图中的功能:
代码如下:

1 #include <iostream>
2 #include <string>
3 #include <sstream>
4
5 using namespace std;
6
7 class Object
8 {
9 protected:
10 string mName;
11 string mInfo;
12 public:
13 Object()
14 {
15 mName = "Object";
16 mInfo = "";
17 }
18 inline string getName()
19 {
20 return mName;
21 }
22 inline string getInfo()
23 {
24 return mInfo;
25 }
26 };
27
28 class Point : public Object
29 {
30 private:
31 int mX;
32 int mY;
33 public:
34 Point(int x = 0, int y = 0)
35 {
36 ostringstream oss;
37
38 mX = x;
39 mY = y;
40 mName = "Point";
41
42 oss << "Point(" << mX << ", " << mY << ")";
43 mInfo = oss.str();
44 }
45 inline int getX()
46 {
47 return mX;
48 }
49 inline int getY()
50 {
51 return mY;
52 }
53 };
54
55 class Line : public Object
56 {
57 private:
58 Point mP1;
59 Point mP2;
60 public:
61 Line(Point p1, Point p2)
62 {
63 mP1 = p1;
64 mP2 = p2;
65 mName = "Line";
66 mInfo = "Line from " + p1.getInfo() + " to " + p2.getInfo();
67 }
68 inline Point getStartPoint()
69 {
70 return mP1;
71 }
72 inline Point getEndPoint()
73 {
74 return mP2;
75 }
76 };
77
78 int main(int argc, char const *argv[])
79 {
80 Object obj;
81 cout << obj.getName() << endl;
82 cout << obj.getInfo() << endl << endl;
83
84 Point p1(1, 2);
85 Point p2(3, 4);
86 cout << p1.getName() << endl;
87 cout << p1.getInfo() << endl;
88 cout << p2.getName() << endl;
89 cout << p2.getInfo() << endl << endl;
90
91 Line line(p1, p2);
92 cout << line.getName() << endl;
93 cout << line.getInfo() << endl << endl;
94
95 return 0;
96 }
关于继承/组合的案例分析
c++中的继承关系的更多相关文章
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式 备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提. 2.子类继承父 ...
- 在Entity Framework 中实现继承关系映射到数据库表
继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分 ...
- Style在Android中的继承关系
Style在Android中的继承关系 Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Androi ...
- Dom中的继承关系
首先声明,一些内容基于个人猜测,如果哪里有错误,请立即联系在下! 我们用js操作Dom时,会经常用到一些个方法比如基于获取到的元素选择其子元素: <!DOCTYPE html> <h ...
- 初步学习C++中的继承关系
继承机制是面向对象程序设计使代码能够复用的最重要的手段,它同意程序猿在保持原有类特性的基础上进行扩展,添加功能. 这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂 ...
- android 中组件继承关系图,一目了然
View继承关系图 Adapter适配器继承关系图 Activity继承关系图
- 浅谈javaScript中的继承关系<一>
// JavaScript Document //创建三个构造函数 function Shape(){ this.name='ahape'; this.toString=function(){retu ...
- java中的继承关系
1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类 ...
- C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象
讲解目录: 1.各类在内存中的表现形式 备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提. 2.子类继承父类 2.1 子类中有虚函数,父类中有虚函数 : 都有的情况下 ...
随机推荐
- 【Python】神器:Streamlit,仅使用Python开发一个运维管理后台(不需要编写html,js,css)
背景 作为SRE,我们有很多很多自动化的工具,大部分都是自动运行的,还有一部分是CLI,我们一直苦于没有一个自己的管理后台网站,受限于前端能力薄弱,开发出来的网页只能说凑活能用,但是不好用. 现在我们 ...
- 更短且不失高效的UUID生成算法
Java原生的UUID长度为36位,嫌长 这里自己实现了一套自己的算法,来生成较短的UUID 由雪花算法启发而来, 大致原理是利用时间戳+随机值做值,然后转换成62进制(当然这个进制数你也可以搞成更多 ...
- [leetcode] 212. 单词搜索 II(Java)
212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...
- Vue的常用特性
Vue的常用特性 一.表单基本操作 都是通过v-model 单选框 1. 两个单选框需要同时通过v-model 双向绑定 一个值 2. 每一个单选框必须要有value属性 且value值不能一样 3. ...
- Pptx的形状转为WPF的Geometry
本文是将演示如何解析pptx文件的形状到WPF当中,并且绘制显示出来 安装Openxml sdk 首先,我们先安装nuget的openxml sdk,下面两种方式都可以安装: nuget包管理器控制台 ...
- NVIDIA GPU上的直接线性求解器
NVIDIA GPU上的直接线性求解器 NVIDIA cuSOLVER库提供了密集且稀疏的直接线性求解器和本征求解器的集合,它们为计算机视觉,CFD,计算化学和线性优化应用程序提供了显着的加速.cuS ...
- 服务化部署框架Paddle Serving
服务化部署框架Paddle Serving 概述 常见的深度学习模型开发流程需要经过问题定义.数据准备.特征提取.建模.训练过程,以及最后一个环--将训练出来的模型部署应用到实际业务中.如图1所示,当 ...
- ffmpeg architecture(中)
ffmpeg architecture(中) 艰苦学习FFmpeg libav 您是否不奇怪有时会发出声音和视觉? 由于FFmpeg作为命令行工具非常有用,可以对媒体文件执行基本任务,因此如何在程序中 ...
- Python进程和线程实例详解
前言 进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需 ...
- vue调用子组件方法时,参数传不过去
有可能是因为子组件方法用了 async await 子组件去掉async就好了