P18 C++ 继承

目录

前言

[01 不使用继承会让你多打很多无用的代码](#01 不使用继承会让你多打很多无用的代码)

[02 继承](#02 继承)

最后的话


前言

本期我们学习 C++ 面向对象编程中的继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。

当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类 ,新建的类称为派生类

继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。

01 不使用继承会让你多打很多无用的代码

继承允许我们有一个相互关联的类的层次结构。展开来说,它允许我们有一个包含公共功能的基类,我们可以从基类中分离出来,基于父类(基类)中创建子类。

类继承的主要作用是它可以帮助我们避免代码重复。

使用类继承后,我们就不需要一遍又一遍的重复一些代码了,我们可以把类之间的所有公共功能放在一个父类中。然后从基类(父类)创建(派生)一些类,稍微改变下功能或者引入全新的功能。这样我们就不用像写模板那样不断重复了。

我们来看看如何在源代码中定义它。

上面的代码中我们创建了一个 动物类,它用来描述动物特征的对象。

在我们现实中我们可能有很多非常不同的动物,然而在某些方面,它们的功能是一样的。

例如也许每个动物都有自己的体重,所以我们double weight,创建一个体重的变量,也有自己的年龄甚至年龄

好了,现在我们有了一个基类,animal 类。

在现实中每一个动物都将是具有这些特征的。

我们继续创建一个新类型的实体,比如创建一条狗

在上面的代码中,我们创建了一个 Dog 类,目前还没有用到所谓的继承概念。我们是从零开始的,这个 Dog类也有体重,年龄,名字,因为它是Dog类,我们还想让它打印自己的身份信息,所以我们定义print_animal_messge 方法,你可以看到当前我们完成的东西和上面的 animal类很像。

到这里,你可以看到它们实际上已经是不同的类了。

cpp 复制代码
class animal
{
private:
protected:
    double weight;    //体重
    int age;                    //年龄
    string name;          //名字

public:

};

class dog
{
private:
public:
    double weight;    //体重
    int age;                    //年龄
    string name;          //名字

    void print_animal_messge()
    {
        cout<<"name:"<<name<<"\t: "<<"weight:"<<weight<< "\t"<<"age:"<<age<<endl;
    }
};

然而能看到有相当多的代码只是被复制粘贴。为了改变这种状况,我们能做的就是利用继承。

02 继承

我们可以扩展animal类来创建 dog类,然后让它存储新数据,比如打印自己的身份信息

现在让我们把 Player 变成 Entity 的子类。

这需要我们在类声明后写一个冒号,然后写上 public animal。

现在在我们写的代码中,发生了一些事情:Dog类现在不仅拥有 Dog类型,它也有 animal类型,它现在是两种类型了。

类型在 C++ 中是相当复杂的主题。一方面它们实际上并不存在,然而另一方面,它们又会在很多地方制造麻烦,后面的系列中我们再去深入了解它是如何工作的。

Dog 现在拥有 animal拥有的所有东西,比如拥有类成员 age 和 weight等等。因为它们本身也在 animal中,所以现在我们把 Dog类中和 animal所有重复的代码都删掉,留下一些不一样的东西就可以了,这些是我们的附加功能

现在这个 Dog类看起来很干净。

cpp 复制代码
class dog:public animal
{
private:
public:
    void print_animal_messge()
    {
        cout<<"name:"<<name<<"\t: "<<"weight:"<<weight<< "\t"<<"age:"<<age<<endl;
    }
};

我要提醒你们,它实际上也是一个 animal,这意味着仅仅看这个类的内容并不能告诉我们关于它的所有信息,如果想全面了解的话,我们必须去找 animal,看看它有什么。因为就 dog而言,任何在 animal类中不是私有的东西实际上都可以被 dog 访问。

让我们来测试一下。

在上面的代码中,我们创建一个 Dog类的实例 xiaoHuan。它不仅可以调用 print函数,------这个函数本身就是在 Dog类里面的。然后也可以使用构造函数进行初始化变量,最后将实例化xiaoHuan的信息打印出来

cpp 复制代码
#include <iostream>
using namespace std;

class animal
{
private:
public:
    int age;                    //年龄
    string name;          //名字
    double weight;    //体重



};

class Dog:public animal
{
private:
public:
    void print_animal_messge()
    {
        cout<<"name:"<<name<<"\t: "<<"weight:"<<weight<< "\t"<<"age:"<<age<<endl;
    }
    Dog(int p_age,string p_name,double p_weight)
    {
        age = p_age;
        name = p_name;
        weight = p_weight;
    }
  
};



int main()
{
    Dog xiaoHuan(15,"xiaoHuan",10.1);
    xiaoHuan.print_animal_messge();
    return 2;
}

最后的话

在本系列课程中我们将分解所有与面向对象编程相关的独立概念,多态、继承等等。所有这些概念都值得好好研究。如果将整个体系如果比喻成一个物件,我还只是接触到了它的表面而已。

相关推荐
小俊俊的博客3 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh5 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
小张认为的测试9 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
南城花随雪。16 分钟前
单片机:实现驱动超声波(附带源码)
单片机·嵌入式硬件
嵌入式科普17 分钟前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
打鱼又晒网17 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
_WndProc18 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_20 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400220 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_4335545427 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++