关键词:
今天我们来讲下 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;
我们看到电脑是由硬盘、内存、CPU和主板构成的,我们看看编译结果
确实在生成电脑这个对象时,先是生成了硬盘、内存、CPU和主板一系列的东西,在析构的时候顺便将这些东西也都清理了。那么我们来看看组合关系的特点:a> 将其它类的对象作为当前类的成员使用;b> 当前类的对象与成员对象的声命周期相同;c> 成员对象在用法上与普通对象完全一致。
那么继承又是怎样的关系呢?继承关系通俗来讲就是父子关系,如下
面向对象中的继承便是指类之间的父子关系,子类拥有父类的所有属性和行为, 子类就是这一种特殊的父类。子类对象可以当做父类对象使用,子类中可以添加父类中没有的方法和属性。C++ 中通过下面的方式描述继承关系
下来我们通过示例代码来看看继承
#include <iostream> #include <string> using namespace std; class Parent int mi; public: Parent() cout << "Parent()" << endl; mi = 100; void method() cout << "mi = " << mi << endl; ; class Child : public Parent public: void hello() cout << "I'm Child calss!" << endl; ; int main() Child d; Child d1; Parent p = d1; d.hello(); d.method(); return 0;
我们直接用类 Child 生成的对象 d 去调用类 Parent 的成员函数 method,而且在第 35 行直接用对象 d1 去初始化对象 p。我们看看编译是否会通过
我们看到没有报错,并且运行成功。我们之前说过子类拥有父类的一切属性,子类对象可以当做特殊的父类对象,所以这就不难解释了。子类对象便可以直接使用父类中的所有资源,这便有点类似于我们在 C 语言中说的代码复用了(其实继承的本质就是复用父类的代码)。那么继承有几条规则:a> 子类便是一个特殊的父类;b> 子类对象是可以直接初始化父类对象的;c> 子类对象可以直接赋值给父类对象。
那么继承的意义是什么呢?继承是 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 10"; 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"); hp.OS(); cout << endl; MacBook mac; mac.OS(); return 0;
我们在电脑的基础上新定义了 hp 和 Mac 两种电脑。给 hp 重装了 Ubuntu 系统,然后打印了它的系统。直接打印 Mac 电脑的系统,看看是否如我们所愿
确实是这样的。通过对继承的学习,总结如下:1、继承是面向对象中类之间的一种关系;2、子类拥有父类的所有属性和行为;3、子类对象可以当做父类对象使用;4、子类中可以添加父类中没有的方法和属性;5、继承是面向对象中代码复用的重要手段。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
2018-08-24第三十六课(代码片段)
第三十六课非关系统型数据库-mangodb目录二十四mongodb介绍二十五mongodb安装二十六连接mongodb二十七mongodb用户管理二十八mongodb创建集合、数据管理二十九php的mongodb扩展三十php的mongo扩展三十一mongodb副本集介绍三十二mongodb副本集搭... 查看详情
wpf学习第三十六章样式基础(代码片段)
...ntStretch(用于压缩或扩展的变体)。得益于这些属性值得继承 查看详情
qt开发(三十六)——model/view框架
QT开发(三十六)——Model/View框架一、Model/View框架简介1、Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自... 查看详情
零基础学java—stringbuilder类(三十六)
【零基础学Java】—StringBuilder的原理(三十六)一、String类字符串是常量,他们的值在创建之后不能更改字符串的底层是一个被final修饰的数组,不能改变,是一个常量privatefinalbyte[]value;进行字符串的相加,... 查看详情
c之内存布局(三十六)
我们在上节中说到了栈区、堆区以及静态存储区,那么我们来看看在程序文件的一般布局。我们先来看看不同代码在可执行程序中的对应关系,如下图所示 ... 查看详情
[机缘参悟-65]:《兵者,诡道也》-7-三十六计解读-败战计
目录前言:第1章 《三十六计》概述第六套败战计第三十一计美人计第三十二计空城计第三十三计反间计第三十四计苦肉计第三十五计连环计第三十六计走为上计前言:兵者,诡道也,兵者,“道”的部分ÿ... 查看详情
-考研第三十六周总结-
-考研第三十六周总结-【本周完成】✅上周计划表中所有内容2011、2016年的数学卷子十七堂课的微分方程部分和泰勒部分手机背单词每天英语写16年英语卷子+讲解课程+细做了14年的阅读政治看背诵手册+做完了近代史部分&... 查看详情
opencv竟然可以这样学!成神之路终将不远(三十六)
返回目录目录36SURF简介(加速的强大功能)36.1目标36.2理论36.3OpenCV中的SURF36SURF简介(加速的强 查看详情
opencv竟然可以这样学!成神之路终将不远(三十六)
返回目录目录36SURF简介(加速的强大功能)36.1目标36.2理论36.3OpenCV中的SURF36SURF简介(加速的强 查看详情
c之函数的意义(三十八)
我们知道在C语言中,程序是由一个个的函数组成的。那么我们来看看函数的由来,程序=数据+算法==>C程序=数据+函数;众所周知,C语言是面向过程的一种编程语言,那么它就是采用的是模... 查看详情
第三十六课文本编辑器中的功能交互
一、判断未保存的数据1、QPlainTextEdit能够触发与编辑功能相关的信号2、解决方案(1)、定义槽函数voidonTextChanged()(2)、映射textChanged()到槽函数(3)、定义成员变量boolm_isTextChanged=false;(4)、当文本框内容发生改变时, m_i... 查看详情
测开之路三十六:常用的css选择器(代码片段)
在static下新建一个css,并写入内容/*标签选择器,label标签的颜色为红色*/labelcolor:red;/*.代表类选择器,绿色*/.testcolor:green;/*#代表id选择器,黄色*/#testcolor:yellow;/*div标签下的魔偶写标签下的lable标签(相对关系),内容的颜色... 查看详情
qt系列文章之三十六(自定义qtdesigner插件)
文章目录前言创建QtDesignerWidget插件项目插件项目各文件的功能实现MyBatteryPlugin类MyBatteryDesignerPlugin.pro的内容内置项目mybattery.pri组件类MyBattery的定义插件的编译与安装使用自定义插件使用MSVC编译器输出中文的问题运行效果图demo... 查看详情
qt系列文章之三十六(自定义qtdesigner插件)
文章目录前言创建QtDesignerWidget插件项目插件项目各文件的功能实现MyBatteryPlugin类MyBatteryDesignerPlugin.pro的内容内置项目mybattery.pri组件类MyBattery的定义插件的编译与安装使用自定义插件使用MSVC编译器输出中文的问题运行效果图demo... 查看详情
性能调优之三十六计——「优中取优」字符串拼接篇(代码片段)
文章目录性能调优之三十六计——「优中取优」字符串拼接篇+操作符fmt.SprintfJoinbuffer.WriteStringbuffer.BuilderQ&A附录性能调优之三十六计——「优中取优」字符串拼接篇性能调优是每一个程序员进阶的毕竟之路,掌握各种... 查看详情
性能调优之三十六计——「优中取优」字符串拼接篇(代码片段)
文章目录性能调优之三十六计——「优中取优」字符串拼接篇+操作符fmt.SprintfJoinbuffer.WriteStringbuffer.BuilderQ&A附录性能调优之三十六计——「优中取优」字符串拼接篇性能调优是每一个程序员进阶的毕竟之路,掌握各种... 查看详情
第三十六天
css组合选择器<!DOCTYPEhtml><html><head> <metacharset="UTF-8"> <title>组合选择器</title> <styletype="text/css"> /*组合选择器*/ /*特性 查看详情
第四百三十六天howcani坚持
到底该怎样,哎。。 自己的私事还是不要和别人提了,只有自己才最懂自己,其实我自己也不懂我自己。 是容易得到的就不懂得珍惜了。还是。。 是因为得不到才会感觉很好嘛,搞不懂,这就是人的通病吧。。... 查看详情