【C++深度剖析教程22】继承的概念和意义
今天我们来学习C++中的继承的概念和意义。
一、类之间的组合关系
问题:类之间是否存在直接的关联关系?
回答:类之间存在组合的关系,整体与部分的关系。
可以看一下生活中的例子:
下面我们以一个简单的程序来看一下类组合的关系:
#include <iostream>
#include <string>using namespace std;class Memory
{
public:Memory(){cout << "Memory()" << endl;}~Memory(){cout << "~Memory()" << endl;}
};class Disk
{
public:Disk(){cout << "Disk()" << endl;}~Disk(){cout << "~Disk()" << endl;}
};class CPU
{
public:CPU(){cout << "CPU()" << endl;}~CPU(){cout << "~CPU()" << endl;}
};class MainBoard
{
public:MainBoard(){cout << "MainBoard()" << endl;}~MainBoard(){cout << "~MainBoard()" << endl;}
};class Computer
{Memory mMem;Disk mDisk;CPU mCPU;MainBoard mMainBoard;
public:Computer(){cout << "Computer()" << endl;}void power(){cout << "power()" << endl;}void reset(){cout << "reset()" << endl;}~Computer(){cout << "~Computer()" << endl;}
};int main()
{ Computer c; //电脑类的创建,依赖于前面四个类的创建return 0;
}
运行结果为:
Memory()
Disk()
CPU()
MainBoard()
Computer()
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()
从上面程序我们可以看出组合关系的特点是:
- 将其他类的对象作为当前类的成员使用
- 当前类的对象与成员对象的生命周期相同
- 成员对象与普通对象在语法上完全相同
二、类之间的继承关系
还是先看一个生活中的实例:
那么继承关系有什么样的性质呢?
面向对象的继承就是指类之间的父子关系
- 子类拥有父类的所有属性和行为
- 子类就是一种特殊的父类
- 子类对象可以当做父类对象使用
- 子类中可以添加父类没有的属性和方法
C++中通过下面的方式描述继承的关系
下面还是来用一个例子程序来分析继承的关系吧:
#include <iostream>
#include <string>using namespace std;class Parent
{int mv;
public:Parent(){cout << "Parent()" << endl;mv = 100;}void method(){cout << "mv = " << mv << endl;}
};class Child : public Parent
{
public:void hello(){cout << "I'm Child calss!" << endl;}
};int main()
{ Child c;c.hello();c.method();return 0;
}
运行结果为:
Parent()
I’m Child calss!
mv = 100
由运行结果可以看出,当执行Child c创建类c时,就直接调用了父类的构造函数进行打印语句。然后执行 c.hello();c.method();这两个语句时,分别调用孩子类的成员函数与父亲类的成员函数,这说明孩子对象可以直接调用父亲的成员函数和本身自己的成员函数。
继承的重要规则:
- 子类就是一个特殊的父类
- 子类对象可以直接初始化父类对象
- 子类对象可以直接赋值给父类对象
继承的意义:
继承是C++中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能。
下面再来一个例子看看继承的规则与意义:
#include <iostream>
#include <string>using namespace std;class Memory
{
public:Memory(){cout << "Memory()" << endl;}~Memory(){cout << "~Memory()" << endl;}
};class Disk
{
public:Disk(){cout << "Disk()" << endl;}~Disk(){cout << "~Disk()" << endl;}
};class CPU
{
public:CPU(){cout << "CPU()" << endl;}~CPU(){cout << "~CPU()" << endl;}
};class MainBoard
{
public:MainBoard(){cout << "MainBoard()" << endl;}~MainBoard(){cout << "~MainBoard()" << endl;}
};class Computer
{Memory mMem;Disk mDisk;CPU mCPU;MainBoard mMainBoard;
public:Computer(){cout << "Computer()" << endl;}void power(){cout << "power()" << endl;}void reset(){cout << "reset()" << endl;}~Computer(){cout << "~Computer()" << endl;}
};class HPBook : public Computer
{string mOS;
public:HPBook(){mOS = "Windows 8";}void install(string os){mOS = os;}void OS(){cout << mOS << endl;}
};class MacBook : public Computer
{
public:void OS(){cout << "Mac OS" << endl;}
};int main()
{ HPBook hp;hp.power();hp.install("Ubuntu 16.04 LTS");hp.OS();cout << endl;MacBook mac;mac.OS();return 0;
}
运行结果为:
Memory()
Disk()
CPU()
MainBoard()
Computer()
power()
Ubuntu 16.04 LTS
Memory()
Disk()
CPU()
MainBoard()
Computer()
Mac OS
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()
我们可以看出,程序的前几个类是组合关系,后面的两个类HPBook与MacBook类与Computer类是继承的关系。其中HPBook与MacBook类继承了Computer类的所有行为。
由以上几个程序的分析可以得出以下几条总结:
- 继承是面向对象中类之间的一种关系
- 子类拥有父类所有的属性和行为
- 子类对象可以当做父类的对象使用
- 子类中可以添加父类中所没有的方法和属性
- 继承是面向对象中代码复用的重要手段
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
【C++深度剖析教程22】继承的概念和意义相关推荐
- 【C++深度剖析教程27】多态的概念与意义
今天来学习一个新的概念,多态!!!多态在C++编程中具有重要的地位与意义,是面向对象的一个重要思想! 加qq1126137994一起学习更多技术~ 1.问题引入 父类与子类之间具有赋值兼容性; *子类 ...
- 【C++深度剖析教程39】实现C++数组类模板
上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...
- 【C++深度剖析教程25】继承中的构造与析构
今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...
- 【C++深度剖析教程24】C++中不同的继承方式
过完年了,今天开始写博客记录学习的过程.继续C++的学习,今天我们来看C++中不同的继承方式. 一.初探继承的方式 从上图看,是否可以将继承中的public换成protected或者private.如 ...
- 【C++深度剖析教程23】继承中的访问级别
本C++课程学习记录,完全来源于狄泰软件学院的相关课程,想一起学习的加我q1126137994或者q群199546072 给你推荐更多相关课程. 今天学习C++中继承的访问级别.首先我们思考一个问题, ...
- 【C++深度剖析教程8】C++的操作符重载的概念
之前学习了类的函数重载的概念,今天学习操作符重载的概念.在这之前我们先看一个例子: 上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法.很显然,正常的+ ...
- 【C++深度剖析教程37】类模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...
- 【C++深度剖析教程35】函数模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.问题引入: C++中有几种变量交换的方法? 定义宏代码块和定义函数 #include <iostream ...
- 【C++深度剖析教程30】C++中抽象类和接口
加qq1126137994 微信:liu1126137994 1.面向对象中的抽象概念; 在现实中,需要知道具体的图形类型才能知道如何求面积,但是对于抽象的'图形',我们是没法求其面积的,而且对其求面 ...
最新文章
- DataGridView 里数据的动态明细 DataGridView GridView
- 参与组织社区活动总结
- 程序员35岁真的是分水岭吗?小白也能看明白
- 没有bug队——加贝——Python 45,46
- SourceTree超前一个版本,落后N个版本
- dnf如何快速拾取物品_DNF游戏里的一些便利性功能,每个都非常实用
- OpenShift 4 - DevSecOps Workshop (15) - 利用OpenShift GitOps向多个目标部署应用
- 李彦宏再立 Flag:人工智能将让人类不再需要手机!
- MapReduce框架下的FP Growth算法概述
- Tensorflow(GPU版安装后代码测试)
- 短网址算法 php,php实现的短网址算法分享
- visual studio 2019 Intel Parallel Studio XE2020下FORTRAN安装及MPI并行配置计算
- 家庭组网 登录光猫超级账户(吉比特GM228-S)改桥接并使用路由器拨号上网 关闭QoS
- 由于找不到mfc100.dll,无法继续执行代码
- mysql基础教程下载_MySQL基础教程
- linux笔记:使用conda命令管理包、管理环境详细讲解
- [毕业生的商业软件开发之路]现代商业软件开发概况
- 文本搜索引擎Lucene之filed详解和代码测试
- 高智商与低智商的区别_体内平衡与智力的定义
- 运维,数据库 知识点文章集锦
热门文章
- :after伪类+content内容清除浮动
- SRZoo--深度学习图像超分辨率工具
- 大型企业用什么orm_生产企业ERP有什么用
- windows 和linux查看硬件信息,Linux下如何查看硬件信息?
- template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
- Programming Assignment 5: Burrows–Wheeler Data Compression
- 订单管理系统(含源码)
- CommonJs、AMD、CMD模块化规范
- hdu 3652 B-number 数位dp
- 2015-05-31