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.mzph.cn/news/173960.shtml

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

相关文章

Flask 实现Token认证机制

在Flask框架中&#xff0c;实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt&#xff0c;我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌&#xff08;Token&#xff09;&…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

【深度学习笔记】02 线性代数基础

线性代数基础 线性代数基础标量向量长度、维度和形状矩阵张量算法的基本性质降维非降维求和点积&#xff08;Dot Product&#xff09;矩阵-向量积矩阵-矩阵乘法范数 线性代数基础 标量 标量由只有一个元素的张量表示 import torchx torch.tensor(3.0) y torch.tensor(2.0)…

一文读懂 | AI技术如何驱动企业供应链智能化,赋能企业降本增效?

近年以来&#xff0c;随着互联网技术的发展&#xff0c;AI的创新研究加速。随着大数据、云计算、物联网等信息技术的发展&#xff0c;以深度神经网络为代表的AI技术迅速发展&#xff0c;图像分类、语音识别、知识问答、无人驾驶等AI技术实现了从“不能用、不好用”到“可以用”…

Mybatis入门(一)

安装 要使用 MyBatis&#xff0c; 只需将 mybatis-x.x.x.jar 文件置于类路径&#xff08;classpath&#xff09;中即可。 如果使用 Maven 来构建项目&#xff0c;则需将下面的依赖代码置于 pom.xml 文件中&#xff1a; <dependency><groupId>org.mybatis</gr…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成&#xff0c;…

优化前端性能

一次在前端面试中问到优化前端性能的方式 一、主要通过两种方式&#xff1a; reflow(回流)和repaint(重绘)。整个在浏览器的渲染过程中&#xff08;页面初始化&#xff0c;用户行为改变界面样式&#xff0c;动画改变界面样式等&#xff09;reflow(回流)和repaint(重绘) 会大大影…

数据结构—树

文章目录 9.树(1).树的基本概念#1.基本定义#2.树的广义表表示法#3.基本术语 (2).树的存储结构#1.标准形式(常用)#2.逆存储形式#3.孩子兄弟存储法 (3).并查集#1.我们到底想解决什么问题#2.并查集结点#2.Find(查)#3.Union(并)#4.例子 (4).树的遍历#1.前序遍历#2.后序遍历#3.遍历的…

winform联合halcon读取图像出现问题

1.在Form1.cs和Form.Designer.cs中添加using HalconDotNet&#xff1b; 2. 3.添加Halcon导入.cs的程序 4.注释掉导出文件的主函数&#xff0c;不然会报错。 .

Python 安装 启动项目 有线版/离线版

测试机器&#xff1a;Linux Centos7 一&#xff0c;安装Python 有线版&#xff1a; 1、首先检查机器的gcc版本&#xff08;要求版本在4.8.5&#xff09; gcc --version 2、安装前置依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel rea…

MLIR笔记(4)

4.3.3. 控制流与SSACFG区域 在MLIR里&#xff0c;区域的控制流语义由RegionKind::SSACFG表示。非正式地&#xff0c;这些区域支持这样的语义&#xff1a;区域里的操作“顺序执行”。在执行一个操作前&#xff0c;它的操作数有定义良好的值。在操作执行后&#xff0c;操作数有相…

C#常见的设计模式-行为型模式

前言 行为型模式是面向对象设计中的一类设计模式&#xff0c;它关注对象之间的通信和相互作用&#xff0c;以实现特定的行为或功能。在C#中&#xff0c;有许多常见的行为型模式&#xff0c;下面将对其中10种行为型模式进行介绍&#xff0c;并给出相应的代码示例。 目录 前言1.…

ky10 server sp3 解决/boot/grub2/grub.cfg 找不到

现象 /boot/grub2 目录下不存在grub.cfg 配置文件 解决 执行下面脚本即可 yum install -y grub2 grub2-mkconfig -o /boot/grub2/grub.cfg 执行完成第一条命令 执行完成第二条命令 查看效果 已经生成这个文件了

Java抽象类和接口(2)

&#x1f435;本篇文章继续对接口相关知识进行讲解 一、排序 1.1 给一个对象数组排序&#xff1a; class Student {public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}public String toString() {return "name:…

[原创]C++98升级到C++20的复习旅途-“函数模板“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

BetaFlight模块设计之三十七:SBUS

BetaFlight模块设计之三十七&#xff1a;SBUS 1. 源由2. sbus启动&动态任务3. 主要函数3.1 sbus初始化3.2 sbusFrameStatus更新3.3 rxFrameTimeUs3.4 sbusDataReceive接收数据 4. 辅助函数4.1 sbusChannelsDecode 5. 参考资料 1. 源由 接着BetaFlight模块设计之三十六&…

coreelec与安卓 双系统共存-默认CoreElec引导后10秒计时进入android插件

在把coreelec写入emmc后&#xff0c;默认打开coreelec&#xff0c;然后通过电源可以重启进入安卓。需要多点好多步骤&#xff0c;下面我通过自己制作的插件来实现开机倒计时默认进入安卓 首先需要打开设置服务里的允许本地控制&#xff0c;并且重启生效&#xff0c;编写自动启…

Leetcode—266.回文排列【简单】Plus

2023每日刷题&#xff08;四十&#xff09; Leetcode—266.回文排列 C语言实现代码 char chara[26] {0};int calculate(char *arr) {int nums 0;for(int i 0; i < 26; i) {nums arr[i];}return nums; }bool canPermutePalindrome(char* s) {int len strlen(s);for(in…

零基础在ubuntu上搭建rtmp服务器-srs

搭建服务器 搭建 SRS&#xff08;Simple-RTMP-Server&#xff09;服务器需要一些步骤&#xff0c;以下是一个简单的步骤指南。请注意&#xff0c;SRS 的配置可能会有所不同&#xff0c;具体取决于你的需求和环境。在开始之前&#xff0c;请确保你的 Ubuntu 系统已经连接到互联…