P18 C++ 继承

 

目录

前言

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

02 继承

最后的话


 

 

前言

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

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

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

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

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

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

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

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

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

 

6e4695895e0d4efabf198e4204cf560f.png

 

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

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

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

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

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

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

4af32908b4b94fb8983ee6a7ac32cc26.png

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

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

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 的子类。

 

1128a2e126c643e4b7d9889eb69d74cc.png

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

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

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

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

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


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 访问。

 

让我们来测试一下。

19d75faf6d944f4a998aa5107a70b180.png

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

#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;
}

最后的话

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

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BC77 简单计算器(牛客)

#include <stdio.h> int main() {double a, b, d;//用来接收浮点数char c;//用来接受符号scanf("%lf %c %lf", &a, &c, &b);if (c || c - || c * || c /)//判断输入的运算符号不包括在&#xff08;、-、*、/&#xff09;范围内{switch (c)//根…

从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中&#xff0c;图像是不可或缺的一部分&#xff0c;而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像&#xff0c;为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧&#xff0c;并通过丰富的示例代码演示如何实现各种功…

因子分析例题(多元统计分析期末复习)

例一 设某客观现象可用 X {X} X( X 1 {X_1} X1​&#xff0c; X 2 {X_2} X2​&#xff0c; X 3 {X_3} X3​)’ 来描述&#xff0c;在因子分析时&#xff0c;从约相关阵出发计算特征值为 λ 1 {λ_1} λ1​1.754&#xff0c; λ 2 {λ_2} λ2​1&#xff0c; λ 3 {λ_3} λ3​…

transformers pipeline出现ConnectionResetError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

(C++)string类的模拟实现

愿所有美好如期而遇 前言 我们模拟实现string类不是为了去实现他&#xff0c;而是为了了解他内部成员函数的一些运行原理和时间复杂度&#xff0c;在将来我们使用时能够合理地去使用他们。 为了避免我们模拟实现的string类与全局上的string类冲突(string类也在std命名空间中)&…

机器学习【04重要】pycharm中关闭jupyter服务器

直接关掉pycharm 不行 点红方块关闭 不行 我们曲线进行 我们的方法成功截图 实现全程不在服务器上操作 首先点击下图 点击退出&#xff0c;即可 查看端口

Java 注解在 Android 中的使用场景

Java 元注解有 5 种&#xff0c;常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别&#xff0c;有三种&#xff1a; RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中&#xff0c;并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…

【Springboot系列】SpringBoot整合WebSocket,既然如此简单(含源码)

文章目录 前言&#xff1a;什么是WebSocket&#xff1f;Spring Boot中的WebSocket支持WebSocket和HTTP优劣势WebSocket的优势&#xff1a;1.实时性&#xff1a;2.较低的延迟&#xff1a;3.较小的数据传输量&#xff1a;4.更好的兼容性&#xff1a; HTTP的优势&#xff1a;1.简单…

从0开始学习JavaScript--JavaScript中的对象原型

JavaScript中的对象原型是理解该语言核心概念的关键之一。本文将深入探讨JavaScript对象原型的作用、使用方法以及与继承相关的重要概念。通过详细的示例代码和全面的讲解&#xff0c;将能够更好地理解和运用JavaScript对象原型&#xff0c;提高代码的可维护性和扩展性。 Java…

RHCE---给openlab搭建web网站

作业&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c; 1、基于 www.openlab.com/student 网站访问学生信…

C#,《小白学程序》第十八课:随机数(Random)第五,方差及标准方差(标准差)的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十八课&#xff1a;随机数&#xff08;Random&#xff09;第五&#xff0c;方差及标准方差&#xff08;标准差&#xff09;的计算方法与代码 /// 方差 SUM(&#xff08;Xi - X)^2 ) / n i0...n-1 X Average of X[i] ///…

如果客户端同时有ipv4和ipv6,浏览器是如何选择用哪种ip

在互联网协议&#xff08;IP&#xff09;的发展历程中&#xff0c;IPv4和IPv6是两种主要的版本。对于一个客户端来说&#xff0c;同时拥有IPv4和IPv6的能力是常见的情况。那么&#xff0c;当一个客户端同时具有IPv4和IPv6的能力时&#xff0c;浏览器是如何选择使用哪种IP进行通…

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容&#xff0c;减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全&#xff08;记录了…

高并发系统:它的通用设计方法是什么?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们知道&#xff0c;高并发代表着大流量&#xff0c;高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案&#xff0c;从而抵抗巨大流量的冲击&#xff0c;带给用户更好的使用体验。这些方案好似能…

Kerberos 高可用配置和验证

参考 https://cloud.tencent.com/developer/article/1078314 https://mp.weixin.qq.com/s?__bizMzI4OTY3MTUyNg&mid2247485861&idx1&snbb930a497f63ac5e63ed20c64643eec5 机器准备 Kerberos主 ip-172-31-22-86.ap-southeast-1.compute.internal 7.common2.hado…

【洛谷算法题】P5715-三位数排序【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5715-三位数排序【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式…

Python----函数的数据 拆包(元组和字典)

Python拆包&#xff1a; 就是把元组或字典中的数据单独的拆分出来&#xff0c;然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

LCR 047. 二叉树剪枝 和 leetCode 1110. 删点成林 + 递归 + 图解

给定一个二叉树 根节点 root &#xff0c;树的每个节点的值要么是 0&#xff0c;要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身&#xff0c;以及所有 node 的后代。 示例 1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红…

【古诗生成AI实战】之一——实战项目总览

[1] 总览 【古诗生成AI实战】系列共五篇文章&#xff1a; 【古诗生成AI实战】之一——实战项目总览   【古诗生成AI实战】之二——项目架构设计   【古诗生成AI实战】之三——任务加载器与预处理器   【古诗生成AI实战】之四——模型包装器与模型的训练   【古诗生成AI…