C++--------继承
一、继承的基本概念
继承是 C++ 中的一个重要特性,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。
#include <iostream>// 基类
class Base {
public:void show() {std::cout << "This is the Base class." << std::endl;}
};// 派生类
class Derived : public Base {
public:void display() {std::cout << "This is the Derived class." << std::endl;}
};int main() {Derived d;d.show(); // 调用基类的方法d.display(); // 调用派生类的方法return 0;
}
解释:
- 基类:
Base类包含一个公共成员函数show()。 - 派生类:
Derived类继承自Base类,使用public继承。它不仅可以访问自己的成员函数display(),还可以访问基类的show()函数。
二、图形对象的继承层次
假设我们要创建一个图形对象的继承层次,可以从一个基类 Shape 开始,然后派生出具体的形状类,如 Circle、Rectangle 等。
#include <iostream>
#include <cmath>class Shape {
public:virtual double area() = 0; // 纯虚函数,使 Shape 成为抽象类virtual void display() {std::cout << "This is a shape." << std::endl;}
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double area() override {return 3.14159 * radius * radius;}void display() override {std::cout << "This is a circle with radius " << radius << std::endl;}
};class Rectangle : public Shape {
private:double length, width;
public:Rectangle(double l, double w) : length(l), width(w) {}double area() override {return length * width;}void display() override {std::cout << "This is a rectangle with length " << length << " and width " << width << std::endl;}
};int main() {Circle c(5.0);Rectangle r(4.0, 6.0);Shape* s1 = &c;Shape* s2 = &r;s1->display();std::cout << "Area of circle: " << s1->area() << std::endl;s2->display();std::cout << "Area of rectangle: " << s2->area() << std::endl;return 0;
}
解释:
- 抽象类:
Shape类包含一个纯虚函数area(),使其成为抽象类,不能被实例化。 - 派生类:
Circle和Rectangle继承自Shape,并实现了area()和display()函数。 - 多态性:通过基类指针指向派生类对象,可以调用派生类的
display()和area()函数,实现多态性。
三、表达式的类层次
对于表达式的类层次,可以创建一个基类 Expression,然后派生出不同类型的表达式类,如 BinaryExpression、UnaryExpression 等。
#include <iostream>class Expression {
public:virtual double evaluate() = 0; // 纯虚函数virtual void display() = 0;
};class Constant : public Expression {
private:double value;
public:Constant(double v) : value(v) {}double evaluate() override {return value;}void display() override {std::cout << value;}
};class BinaryExpression : public Expression {
protected:Expression* left;Expression* right;
public:BinaryExpression(Expression* l, Expression* r) : left(l), right(r) {}~BinaryExpression() {delete left;delete right;}
};class Addition : public BinaryExpression {
public:Addition(Expression* l, Expression* r) : BinaryExpression(l, r) {}double evaluate() override {return left->evaluate() + right->evaluate();}void display() override {left->display();std::cout << " + ";right->display();}
};int main() {Expression* e1 = new Constant(5);Expression* e2 = new Constant(3);Expression* sum = new Addition(e1, e2);sum->display();std::cout << " = " << sum->evaluate() << std::endl;delete sum;return 0;
}
解释:
- 基类:
Expression是一个抽象类,包含纯虚函数evaluate()和display()。 - 派生类:
Constant表示常量表达式,存储一个值。BinaryExpression是一个抽象类,包含左右操作数。Addition是BinaryExpression的派生类,实现加法操作。
四、解析表达式
解析表达式可以使用递归下降解析器,结合表达式的类层次结构。例如,解析 3 + 5 这样的表达式:
- 可以先创建
Constant对象表示3和5,然后创建Addition对象表示3 + 5。
五、多重继承
多重继承允许一个类继承自多个基类。
#include <iostream>class Base1 {
public:void show1() {std::cout << "This is Base1." << std::endl;}
};class Base2 {
public:void show2() {std::cout << "This is Base2." << std::endl;}
};class Derived : public Base1, public Base2 {
public:void display() {std::cout << "This is Derived." << std::endl;}
};int main() {Derived d;d.show1();d.show2();d.display();return 0;
}
解释:
- 多重继承:
Derived类继承自Base1和Base2,因此可以访问Base1和Base2的成员函数,以及自己的成员函数。
注意事项
- 多重继承的二义性:当多个基类有相同的成员函数或变量时,可能会产生二义性问题。可以使用作用域解析运算符
::来消除二义性。 - 虚继承:在菱形继承结构中,使用虚继承可以避免重复继承相同基类的问题。
#include <iostream>class GrandParent {
public:void show() {std::cout << "This is GrandParent." << std::endl;}
};class Parent1 : virtual public GrandParent {};
class Parent2 : virtual public GrandParent {};
class Child : public Parent1, public Parent2 {};int main() {Child c;c.show(); // 不会产生二义性return 0;
}
总结
- 继承:允许代码重用和建立类层次关系,派生类继承基类的成员。
- 图形对象继承层次:可以创建抽象基类和派生类表示不同形状,实现多态性。
- 表达式类层次:使用继承实现不同类型的表达式,便于扩展和解析表达式。
- 多重继承:一个类可以继承多个基类,但要注意二义性和菱形继承问题,可以使用虚继承解决。

相关文章:
C++--------继承
一、继承的基本概念 继承是 C 中的一个重要特性,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…...
Python PyMupdf 去除PDF文档中Watermark标识水印
通过PDF阅读或编辑工具,可在PDF中加入Watermark标识的PDF水印,如下图: 该类水印特点 这类型的水印,会在文件的字节流中出现/Watermark、EMC等标识,那么,我们可以通过改变文件字节内容,清理掉…...
改进爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)
概率爬山法(Probabilistic Hill Climbing,PHC)是一种局部搜索算法,它结合了随机性和贪婪搜索的特点,是对爬山算法(Hill Climbing Algorithm)的一种变体或扩展。与传统的爬山法不同,PHC不是总是选择最优的邻居作为下一步的移动,而是以一定的概率选择最优邻居,同时以一…...
解读DeepseekV3
本年度还剩几天,Deepseek就发布了这么值得惊喜的产品,我觉得是真正做AI,也喜欢AI同学,对这个魔幻的2024年12月,一定是未来多少年想起都能回忆起这波澜壮阔的岁月。 我见过的最省的GPT4o,Claude,…...
【网络安全 | 漏洞挖掘】如何通过竞态条件发现账户接管漏洞
未经许可,不得转载。 文章目录 背景正文设置竞态条件实现漏洞背景 目标应用允许用户创建项目。这些项目中包含多个用户角色,每个角色权限不同(如所有者、管理员、成员管理者等)。用户可通过接受邀请来加入项目,而只有项目所有者才能通过输入邮箱将项目所有权转移给其他用…...
串口通信标准RS232、RS422、RS485有什么区别和不同
目录 第一个区别:硬件管脚接口定义不同: 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 RS-232与RS-485对比 RS-422与RS-485对比 今天给大家分享的是&…...
win版ffmpeg的安装和操作
一、ffmpeg软件安装: ffmpeg是一个通过命令行将视频转化为图片的软件。 在浏览器搜索ffmpeg在官网里找到软件并下载(不过官网很慢),建议用这个下载。 下载的文件是一个zip压缩包,将压缩包解压,有如下文件…...
力扣56. 合并区间
此题在技巧上需要掌握Lambda表达式,在 C 的 Lambda 表达式 中,[] 是 捕获列表(capture list),用于指定 Lambda 表达式如何访问其外部作用域的变量。 [捕获列表](参数列表) -> 返回类型 {函数体 };• 捕获列表&…...
2024基于大模型的智能运维(附实践资料合集)
基于大模型的智能运维是指利用人工智能技术,特别是大模型技术,来提升IT运维的效率和质量。以下是一些关键点和实践案例: AIOps的发展:AIOps(人工智能在IT运维领域的应用)通过大数据分析和机器学习技术&…...
Android Java 版本的 MSAA OpenGL ES 多重采样
最近多次被小伙伴问到 OpenGL 多重采样,其实前面文章里多次讲过了,就是构建2个缓冲区,多重采样缓冲区和目标解析缓冲区。 代码流程 // Framebuffer IDs private int msaaFBO; private int msaaColorBuffer; private int msaaDepthBuffer;pr…...
YOLO11改进-注意力-引入自调制特征聚合模块SMFA
本篇文章将介绍一个新的改进机制——SMFA(自调制特征聚合模块),并阐述如何将其应用于YOLOv11中,显著提升模型性能。随着深度学习在计算机视觉中的不断进展,目标检测任务也在快速发展。YOLO系列模型(You Onl…...
VMware虚拟机安装银河麒麟操作系统KylinOS教程(超详细)
目录 引言1. 下载2. 安装 VMware2. 安装银河麒麟操作系统2.1 新建虚拟机2.2 安装操作系统2.3 网络配置 3. 安装VMTools 创作不易,禁止转载抄袭!!!违者必究!!! 创作不易,禁止转载抄袭…...
Elasticsearch-索引的批量操作
索引的批量操作 批量查询和批量增删改 批量查询 #批量查询 GET product/_search GET /_mget {"docs": [{"_index": "product","_id": 2},{"_index": "product","_id": 3}] }GET product/_mget {"…...
【Android】application@label 属性属性冲突报错
错误记录 What went wrong: Execution failed for task :app:processDebugMainManifest. > Manifest merger failed : Attribute applicationlabel value(string/app_name) from AndroidManifest.xml:8:9-41is also present at [:abslibrary] AndroidManifest.xml:25:9-47 v…...
手机发烫怎么解决?
在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...
【Artificial Intelligence篇】AI 携手人类:共铸未来创作新纪元
引言: 随着科技的飞速发展,人工智能已逐渐渗透到各个领域,尤其是在创作领域,其与人类的合作展现出了前所未有的可能性和潜力。从艺术作品的生成到文学作品的创作,从复杂软件的开发到创新设计的构思,AI 正在…...
小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面
文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则,开启外网访问WEB管理和SSH 前言 例如:随着人工智能的不断发展…...
Go快速开发框架2.6.0版本更新内容快速了解
GoFly企业版框架2.6.0版本更新内容较多,为了大家能够快速了解,本文将把更新内容列出详细讲解。本次更新一段时间以来大伙反馈的问题,并且升级后台安全认证机制,增加了RBAC权限管理及系统操作日志等提升后台数据安全性。 更新明细…...
条件语句 - if, else, switch-case
引言 条件语句是编程中用于根据不同的条件执行不同代码块的重要工具。C 提供了 if、else 和 switch-case 等条件语句,帮助程序员实现逻辑分支。本文将详细介绍这些条件语句的用法,并通过实例帮助读者更好地理解和掌握这些概念。 一、if 语句 if 语句是…...
Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题
Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题 一、问题场景 [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: The primary key is necessary when enable Key: scan.incremental.snapshot.enabled , default: …...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
