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: …...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...