C++基础(十)
<第十三章 类的继承>
类的继承使得类能够从已有的类派生出新的类,而派生类继承了原有类(基类)的特征,包括方法。

一、创建一个基类与其派生类
上面说了派生类可以继承基类的特征和方法,下面先创建一个类,然后在其基础上创建一个派生类(在Python里面,这对关系叫父类与子类,基类作为父类)。
1、首先创建基类的头文件及.cpp文件
头文件:

#pragma once
#include"list.h"
class Tabtenn
{private:string firstname;string lastname;bool hasTable;
public:Tabtenn(const string& fn = "none",const string& ln = "none",bool ht = false);void name()const;bool Hastable()const { return hasTable; }void resetTable(bool v) { hasTable = v; }};

.cpp文件:

#include "Tabtenn.h"Tabtenn::Tabtenn(const string& fn ,const string& ln,bool ht )
{firstname = fn;lastname = ln;hasTable = ht;
}void Tabtenn::name()const
{cout << lastname << endl;
}

该类记录的球员的姓名和一个状态(是否有球桌),然后其包含的接口函数就是可以打印当前的球员的姓名。
2、创建一个派生类
上面的类明显结构简单而且功能单一,现在需要另外一个类来记录球员的得分,如果还是从头开始定义相关的名字等信息的话明显是浪费的,使用类继承可以节省时间。
创建一个派生类的空架构:

class Rateplayer :public Tabtenn
{....
};

Rateplayer是Tabtenn的派生类,其对象将具有以下特性:
派生类对象存储了基类的数据成员
派生类对象可以使用基类的方法

因此Rateplayer的对象可以存储球员的姓名和是否有球桌,还能使用基类的成员函数。
思考:派生类作为类,同样需要自己的构造函数,同时派生类其实可以看作是基类的一种扩充,它可以根据需要来添加额外的数据成员和成员函数。
3、派生类的构造函数权限
如果派生类继承了基类的特性,那么能不能在派生类的构造函数里面初始化基类的数据值呢,这样岂不是更加方便?
派生类不能直接访问基类的私有成员,而必须通过基类的方法进行访问,这样的话在派生类里面使用基类的构造函数,不就可以对基类实现初始化了吗
创建派生类对象时,程序首先创建基类对象(这时应当的,不然去哪继承特性呢), 所以可以这样写派生类的构造函数:

Rateplayer::Rateplayer(int r, const string& fn, const string& ln, bool ht) :Tabtenn(fn, ln, ht)
{rating = r;
}

在构建派生类对象时,顺便也把基类对象构建了并初始化了。在这里如果不调用基类的构造函数的话,系统还是会调用默认的基类构造函数,为了避免不必要的错误,应当显式的调用默认的基类构造函数。

二、使用基类与派生类
使用之前,继续完善我们之前创建的派生类。

class Rateplayer :public Tabtenn
{private:int rating;
public:Rateplayer(int r, const string& fn, const string& ln, bool ht);void show_rating()const;
};

其函数的定义,我也写在了Tabtenn类的.cpp文件中:

Rateplayer::Rateplayer(int r, const string& fn, const string& ln, bool ht) :Tabtenn(fn, ln, ht)
{rating = r;
}void Rateplayer::show_rating()const
{cout<<"rating is: " << rating << endl;
}

添加了一个int型数据来存储当前球员的分数,然后再main函数内,创建一个派生类对象:

int main()
{Rateplayer player1(100, "jeck", "mass", false);cout << player1.Hastable() << endl;player1.show_rating();......

player1对象并不属于Tabtenn类,但是由于是其派生类,因此可以调用其中的成员函数。
思考:创建派生类对象时,基类的对象在那里存储呢,怎样访问?
另外一种派生类的构造函数的书写:

Rateplayer::Rateplayer(int r, const Tabtenn&t): Tabtenn(t)
{rating = r;
}

这样写的话,相当于我们给一个已知的基类对象创建派生类对象,并且该派生类对象将会继承基类对象的特性。传入的参数为基类对象的引用,该构造函数会调用基类的默认复制构造函数,将对象的值复制给创建的临时对象,再由派生类对象继承。
使用刚才创建的构造函数:

int main()
{Rateplayer player1(100, "jeck", "mass", false);Tabtenn player2("male", "jone", true);Rateplayer player3(990, player2);player3.name();

思考:实际创建构造函数时,构造函数应当尽可能多的包含不同情况,这样程序才能更加灵活
派生类构造函数的特点如下:
(1)、首先会创建一个基类对象
(2)、派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
(3)、派生类构造函数应初始化派生类新增的数据成员。
笔记:之前说过对于一个类来说,其构造函数与析构函数都是必须的,如果没有显式的定义,那么系统将会默认执行。但是创建的顺序与释放的顺序时相反的,这类似于堆栈,即–先入后出

三、派生类与基类的关系探究
派生类与基类之间有一些特殊关系,其中之一就是派生类对象可以使用基类的方法(成员函数),条件是该方法不是私有成员。
另外两个重要关系是:基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。(难懂)

int main()
{Rateplayer player1(100, "jeck", "mass", false);Tabtenn player2("male", "jone", true);Rateplayer player3(990, player2);Tabtenn& rt = player1;Tabtenn* pt = &player1;

也就是这两种写法都是可以的,该种引用和指针虽然声明为Tabtenn类型,但是其指向的内容却是它的派生类对象。
然而,基类指针或者引用只能用于调用基类方法,因此上面的引用和指针不能调用派生类中的成员方法。

可以看到不包含派生类中定义的成员函数。
总结一下就是虽然指向的对象是派生类对象,但是只能调用基类的方法。

思考:前面提到了一个问题就是如果单独创建派生类对象,那么系统首先创建的基类对象该怎么访问呢?使用上面的操作,就可以单独操作基类对象内的方法了。
此外,不可以将基类对象和地址赋给派生类引用和指针。

C++基础(C++Primer学习)相关推荐

  1. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  2. 如何正确的通过 C++ Primer 学习 C++?(转自知乎)

    作者:dawnmist 链接:https://www.zhihu.com/question/32087709/answer/54936403 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 个 ...

  3. 保姆级零基础 C 语言学习路线,万字总结!

    从大学接触 C 语言编程,工作之后一直从事互联网 C/C++ 后台开发工作,粗略算下来有 10 多年经验了(但是年限也并不能代表什么),只能说对 C 语言学习有一些经验可以分享给初学者,让你少走一些弯 ...

  4. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

  5. 为学弟学妹熬夜的一份零基础 C++ 开发学习路线

    大家好,我是帅地. 之前写过几篇学习路线的文章 前端开发学习路线 Java 后端开发学习路线 一般开发岗主流的就是 Java 后台开发,前端开发以及 C++ 后台开发,现在 Go 开发也是越来越多了, ...

  6. 如何正确通过 C++ Primer 学习 C++?

    链接:https://www.zhihu.com/question/32087709 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 即将读研,虽然考的是本专业(GIS),但是研究生读的专业在计 ...

  7. SolidWorks大师班:从基础到专业学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:2.4 GB 含课程文件 |时长:3h ...

  8. 0基础学怎么学习python

    ​ Python相对于其他编程语言来说是比较简单的,非常适合零基础的小白学习,想要进入到互联网行业,可以优先选择学习Python,那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? ​ ...

  9. ui设计培训需要什么基础?如何入门学习?

    ​ UI设计是一种直观面向用户的一个技术岗位,在互联网公司,UI设计岗位是不可或缺的,那么对于零基础想要学习UI设计的同学来说,ui设计培训需要什么基础?如何入门学习呢?我们来看看下面的详细介绍. ​ ...

  10. 零基础该如何学习Web前端知识?

    想要跳槽到IT行业人在近几年越来越多,大部分都是想要学习web前端技术,但是这其中有很多都是零基础学员,大家都想知道零基础该如何学习Web前端知识?我们来看看下面的详细介绍. 零基础该如何学习Web前 ...

最新文章

  1. Spark Troubleshooting - Task not serializable问题分析
  2. 【剑指offer】_18 数据流中的中位数
  3. Java程序练习-螺旋矩阵
  4. Android入门(三) | Android 的日志工具 Logcat
  5. 计算2的N次方(信息学奥赛一本通-T1170)
  6. linux运行欧陆风云,Arm linux启动分析(1)
  7. easyUI 的combobox如何获取除valueField和textField外的三个值
  8. linux环境下的TIME_WAIT和CLOSE_WAIT问题解决方法
  9. 网络工程师(软考)学习笔记6--传输介质
  10. Vue 项目更新,浏览器不需强制刷新就可更新版本! 防止缓存
  11. 《勘测定界界址点坐标交换格式》解析
  12. 游戏外挂:用Python做个小游戏的开挂
  13. Ubuntu系统查看显卡型号
  14. 性能监控平台:基于 Prometheus+InfluxDB + Grafana
  15. java deflate_JAVA中的deflate压缩实现方法
  16. [摘]用Java生成Word文档
  17. ftp上传工具 免安装,ftp上传工具 免安装绿色破解版好用推荐
  18. C语言中什么叫做左值?右值?
  19. python+airtest+夜神模拟器自动化测试
  20. [maven] maven

热门文章

  1. Step2:【C51】蜂鸣器发声实验
  2. Oracle并集union和union all
  3. 【英语竞赛】听力速记
  4. 3dsMax学习笔记01_用VRayMtl材质制作玻璃材质
  5. DruidDataSource - abandon connection, owner thread: 错误原因
  6. (阅读笔记)脑中线偏移测量及其自动化技术与算法综述
  7. Spark Event Log (一)概述
  8. java 项目的部署方案
  9. 物联网挑战赛【从零到一】
  10. 斯蒂文斯理工学院计算机专业应聘,斯蒂文斯理工学院回国认可度高不高