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

最后的话

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

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统——解决了我的一些困惑

目录 1、电脑开机做了什么事情 2、真正实现并行的计算机 3、计算机中的淘汰算法 & 分配算法 & 调度算法 & 空间管理 4、什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f;最多可分配多少&#xff1f; 5、TLB&#xff08;快表&#xff09;、分页存储&…

详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

论文地址&#xff1a;RT-DETR论文地址 代码地址&#xff1a;RT-DETR官方下载地址 目录 一、本文介绍 二、RT-DETR的网络结构 2.1、模型概览 2.2、高效混合编码器 2.3、IoU感知查询选择 2.4、 可扩展的RT-DETR 三、RT-DERT的环境搭建 四、免费数据集获取 五、获取RT-D…

【PyQt】(自定义类)阴影遮罩-升级版

这是之前发的代码(自定义类)阴影遮罩的升级版。 升级就升级在&#xff0c;优化了对非矩形控件的遮盖效果&#xff0c;例如圆角按钮&#xff0c;以及默认方法不满足时可以传入其他的遮盖方法。 自定义阴影遮罩Mask&#xff1a; class Mask(QWidget):__excludeNone__colorNonecl…

基于51单片机的信号发生器仿真设计

这里写目录标题 基于51单片机信号发生器仿真设计1 设计说明&#xff1a;2 讲解视频&#xff1a;3 仿真电路&#xff1a;程序LCD1602显示按键扫描主函数正弦波发生子程序矩形波发生子程序三角波发生子程序锯齿波发生子程序 设计说明书资料清单&&下载链接资料下载链接 基…

Android aidl的简单使用

一.服务端 1.创建aidl文件&#xff0c;然后记得build下生成java文件 package com.example.aidlservice31;// Declare any non-default types here with import statementsinterface IMyAidlServer {// 接收一个字符串参数void setData(String value);// 返回一个字符串String …

树状数组专题

折叠 区间修改&#xff0c;区间查询&#xff0c;这一类题通常都可以使用线段树解决&#xff0c;但对于此题&#xff0c;树状数组同样可以&#xff0c;而且常数较小&#xff0c;代码简单。 思路&#xff1a; 考虑使用树状数组去维护差分数组&#xff0c;即对于 a i a_i ai​,我们…

国内20个大模型中文场景测评及体验

中文场景能力测评 SuperCLUE排行榜 大模型及网站 公司&#xff08;大模型&#xff09; 智能程度 借鉴点 体验网站 备注 1 百度文心一言 高   文心一言   2 百川智能 高   百川大模型-汇聚世界知识 创作妙笔生花-百川智能   3 商汤商量SenseChat&#xff…

Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统&#xff0c;当我们不想移动值的所有权时&#xff0c;我们可以使用引用和借用&#xff0c;而这正是本章想要讨论的问题。 引用&#xff08;References&#xff09; 引用允许你访问或修改数据而无需获取数据的所有权。在 Rust 中&…

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools 1. 文章简介2. 文章概括3 文章重点技术3.1 Toolformer3.2 APIs 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Toolformer: Language Models Can Teach Themselves to Use Tools作者&#…

鸿蒙(HarmonyOS)应用开发——装饰器

简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发高性能应用。TS是JavaScript&#xff08;简称JS&#xff09;的超…

【浅尝C++】类与对象之定义、实例化、访问限定符及this指针

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;好想摆烂&#xff0c;又好想学习~~ 文章前言&#xff1a;本篇文章简要介绍C类的定义、实例化、访问限定符和this指针&#xff0c;介绍每个小点时&#…

YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 一、本文介绍 本文给大家带来的改进机制是可切换的空洞卷积&#xff08;Switchable Atrous Convolution, SAC&#xff09;是一种创新的卷积网络机制&#xff0c;专为增强物体检测和分割任务中的特征提取而…