C++:类的继承

在C++中,类的继承是一种面向对象编程(OOP)的重要特性,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。通过继承,可以重用现有的代码,减少重复代码,提高代码的可维护性和扩展性。

1. 基本概念

  • 基类(Base Class 或 Parent Class):被继承的类。
  • 派生类(Derived Class 或 Child Class):从基类继承的类。

2. 继承的语法

在C++中,使用冒号 : 来表示继承关系,并指定继承方式。继承方式有三种:

  • 公有继承(public):基类的公有成员和保护成员在派生类中保持原来的访问级别。
  • 私有继承(private):基类的公有成员和保护成员在派生类中变为私有成员。
  • 保护继承(protected):基类的公有成员和保护成员在派生类中变为保护成员。
class DerivedClass : access_specifier BaseClass {// 派生类的成员
};

其中 access_specifier 可以是 public、private 或 protected。

3. 示例

假设我们有一个基类 Animal,它有一些基本的属性和方法。然后我们定义一个派生类 Dog,它继承自 Animal 并添加了一些新的特性和方法。

#include <iostream>
using namespace std;// 基类
class Animal {
protected:string name;int age;public:Animal(string n, int a) : name(n), age(a) {}void eat() const {cout << name << " is eating." << endl;}virtual void makeSound() const {cout << "Some generic animal sound" << endl;}virtual ~Animal() {}  // 虚析构函数,确保派生类的析构函数被正确调用
};// 派生类
class Dog : public Animal {
public:Dog(string n, int a) : Animal(n, a) {}void makeSound() const override {cout << name << " barks: Woof!" << endl;}void fetch() const {cout << name << " is fetching the ball." << endl;}
};int main() {Animal animal("Generic Animal", 5);Dog dog("Rex", 3);animal.eat();animal.makeSound();dog.eat();dog.makeSound();dog.fetch();return 0;
}
  • 解释
    • 基类 Animal
      包含两个受保护的成员变量 name 和 age。
      包含一个构造函数,用于初始化成员变量。
      包含一个 eat 方法和一个虚方法 makeSound。
      包含一个虚析构函数,确保派生类的析构函数被正确调用。
    • 派生类 Dog
      使用公有继承 public 继承自 Animal。
      包含一个构造函数,调用基类的构造函数来初始化继承的成员变量。
      重写了基类的 makeSound 方法,提供特定于狗的行为。
      添加了一个新的方法 fetch,这是狗特有的行为。
    • 主函数 main
      创建了一个 Animal 对象和一个 Dog 对象。
      调用 Animal 对象的方法,展示通用动物的行为。
      调用 Dog 对象的方法,展示狗的特定行为。
  • 重要概念
    • 虚函数(Virtual Function):
      在基类中声明为 virtual 的函数可以在派生类中被重写(覆盖)。当通过基类指针或引用调用虚函数时,实际调用的是派生类中的版本。
      虚析构函数确保派生类的析构函数被正确调用,防止资源泄漏。
    • 多态(Polymorphism):
      多态允许基类指针或引用来调用派生类的方法。这是通过虚函数实现的。
      例如,可以将 Dog 对象赋值给 Animal 类型的指针或引用,并调用 makeSound 方法,实际调用的是 Dog 类中的 makeSound 方法。
  • 运行结果:
    在这里插入图片描述

通过继承,可以构建层次化的类结构,提高代码的复用性和可维护性。类的继承是C++中实现代码复用和扩展的强大工具,但也需要仔细设计以避免复杂的继承关系和潜在的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

详细解读Gson 、Jackson 、FastJson 三大json序列化工具

一 gson Google提供的用来java对象和JSON数据之间进行映射的JAVA类库 优缺点 优点&#xff1a;快速、高效&#xff0c; 依赖少只有一个jar包&#xff0c;面向对象&#xff0c;数据传输解析方便 缺点&#xff1a;速度较慢 mvn依赖 <dependency><groupId>com.go…

版块控制---git

引入 设想&#xff0c;当我们写论文时&#xff0c;对第一版不够满意时&#xff0c;想做出修改但是又怕修改时回毁掉整个论文版本&#xff0c;所以我们通常会进行备份&#xff0c;以防止数据被修改后的崩毁&#xff0c;版块控制就是这个合理创建管理备份的过程&#xff0c;而且这…

BLE 蓝牙客户端和服务器连接

蓝牙通信在设计小型智能设备时非常普遍&#xff0c;之前一直没有使用过&#xff0c;最近使用ardunio ESP32 做了一些实验&#xff0c;做了一个收听播客的智能旋钮&#xff08;Smart Knob&#xff09;&#xff0c;它带有一个旋转编码器和两个按键。 本文介绍BLE 服务器Server和W…

图(Graph)的概念和遍历

目录 定义 相关概念 无向图&#xff08;Undirected graphs) 有向图&#xff08;Directed graphs&#xff09; 完全图 稀疏图 稠密图 权&#xff08;Weight&#xff09; 网&#xff08;Network&#xff09; 子图&#xff08;Subgraph&#xff09; 图的顶点与边间关系 …

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

Unity图形学之RenderQueue

1.指定物体的渲染顺序 Tags { “Queue” “XXXX” } 取值类型&#xff1a; Background&#xff1a; 对应数值为 1000&#xff0c;用于需要被最先渲染的对象&#xff0c;。 Geometry&#xff1a; 对应数值为 2000, 用于不透明的物体。这个是默认的选项&#xff08;如果不指明…

i春秋-破译(凯撒密码+数字替换单词中的字母)

练习平台地址 竞赛中心 题目描述 题目内容 就是破译&#xff01;&#xff01;&#xff01; 解题 观察到最后一段是四个字母加上{xxxxx}的形式&#xff0c;很像flag&#xff0c;我们猜测要破译的主要是这个片段 大括号依然存在&#xff0c;那么可能是通过凯撒密码来加密的&a…

丹摩征文活动|平台评测与使用体验报告

一、基本信息 目标产品 丹摩智算平台www.damodel.com 体验设备 台式机 体验系统/环境 Windows 10/浏览器 体验时间 2024/11 二、产品信息 产品类型&#xff1a;云计算服务提供商 产品定位&#xff1a;提供AI开发和算力GPU租赁服务的平台。它旨在简化AI开发流程&#…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流 2024/11/18 16:38 缘起&#xff0c;使用荣品的DTS。 Y:\RK3566_RK3568_Linux5.10_V1.2.0\device\rockchip\.chips\rk3566_rk3568\rockchip_rk3566_evb2_lp4x_v10_defconfig 1、指定RK_KERNEL_DTS_NAM…

基于java+SpringBoot+Vue的基于web的智慧社区设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

分析一个库 便于以后的使用 WiFiManager.h 2024/11/18

这一段是开启服务器 的 这些都不是重点 重点是那个R_update ,没猜错的话应该是升级的功能 直接索引到定义看看 ,很明显这里是设置了一个 web 访问地址 那就只有换个思路往后查找 handleUpdate 找到这个函数定义 void WiFiManager::handleUpdate() {#ifdef WM_DEBUG_LEVELDEBUG…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…

【MySQL系列】深入理解MySQL中的存储、排序字符集

前言 在创建数据库时&#xff0c;我们经常会需要填写数据库的所用字符集、排序规则&#xff0c;字符集和排序规则是两个非常重要的概念&#xff0c;它们决定了数据库如何存储和比较字符串数据。在 MySQL 中&#xff0c;常用的存储字符集有 utf8、utf8mb4&#xff0c;而排序字符…

tcp 超时计时器

在 TCP&#xff08;传输控制协议&#xff09;中有以下四种重要的计时器&#xff1a; 重传计时器&#xff08;Retransmission Timer&#xff09; 作用&#xff1a;用于处理数据包丢失的情况。当发送方发送一个数据段后&#xff0c;就会启动重传计时器。如果在计时器超时之前没有…

Docker部署ES7.9.3单节点

Elasticsearch&#xff08;简称ES&#xff09;是一个分布式、可扩展、实时的搜索与数据分析引擎&#xff01; Elasticsearch位于Elastic Stack核心&#xff0c;为所有类型的数据提供近乎实时的搜索和分析。无论是结构化或非结构化文本、数字数据还是地理空间数据&#xff0c;El…

ChromeDriver驱动下载地址更新(保持最新最全)

说明&#xff1a; ChromeDriver 是 Selenium WebDriver 用于控制 Chrome 的独立可执行文件。 为了方便下载使用&#xff0c;本文保持ChromeDriver的最新版本更新&#xff0c;并提供115.0.5763.0-133.0.6841.0版本的下载地址&#xff1a; 所有版本和下载地址&#xff1a; &am…

CSS:高级寄巧

精灵图 为什么需要精灵图呢&#xff1f; 一个网页中往往会应用很多小背景图作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有…