当前位置: 首页 > news >正文

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 开始,然后派生出具体的形状类,如 CircleRectangle 等。

#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(),使其成为抽象类,不能被实例化。
  • 派生类CircleRectangle 继承自 Shape,并实现了 area()display() 函数。
  • 多态性:通过基类指针指向派生类对象,可以调用派生类的 display()area() 函数,实现多态性。

三、表达式的类层次

对于表达式的类层次,可以创建一个基类 Expression,然后派生出不同类型的表达式类,如 BinaryExpressionUnaryExpression 等。

#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 是一个抽象类,包含左右操作数。
    • AdditionBinaryExpression 的派生类,实现加法操作。

四、解析表达式

解析表达式可以使用递归下降解析器,结合表达式的类层次结构。例如,解析 3 + 5 这样的表达式:

  • 可以先创建 Constant 对象表示 35,然后创建 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 类继承自 Base1Base2,因此可以访问 Base1Base2 的成员函数,以及自己的成员函数。

注意事项

  • 多重继承的二义性:当多个基类有相同的成员函数或变量时,可能会产生二义性问题。可以使用作用域解析运算符 :: 来消除二义性。
  • 虚继承:在菱形继承结构中,使用虚继承可以避免重复继承相同基类的问题。
#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 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…...

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具&#xff0c;可在PDF中加入Watermark标识的PDF水印&#xff0c;如下图&#xff1a; 该类水印特点 这类型的水印&#xff0c;会在文件的字节流中出现/Watermark、EMC等标识&#xff0c;那么&#xff0c;我们可以通过改变文件字节内容&#xff0c;清理掉…...

改进爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)

概率爬山法(Probabilistic Hill Climbing,PHC)是一种局部搜索算法,它结合了随机性和贪婪搜索的特点,是对爬山算法(Hill Climbing Algorithm)的一种变体或扩展。与传统的爬山法不同,PHC不是总是选择最优的邻居作为下一步的移动,而是以一定的概率选择最优邻居,同时以一…...

解读DeepseekV3

本年度还剩几天&#xff0c;Deepseek就发布了这么值得惊喜的产品&#xff0c;我觉得是真正做AI&#xff0c;也喜欢AI同学&#xff0c;对这个魔幻的2024年12月&#xff0c;一定是未来多少年想起都能回忆起这波澜壮阔的岁月。 我见过的最省的GPT4o&#xff0c;Claude&#xff0c…...

【网络安全 | 漏洞挖掘】如何通过竞态条件发现账户接管漏洞

未经许可,不得转载。 文章目录 背景正文设置竞态条件实现漏洞背景 目标应用允许用户创建项目。这些项目中包含多个用户角色,每个角色权限不同(如所有者、管理员、成员管理者等)。用户可通过接受邀请来加入项目,而只有项目所有者才能通过输入邮箱将项目所有权转移给其他用…...

串口通信标准RS232、RS422、RS485有什么区别和不同

目录 第一个区别&#xff1a;硬件管脚接口定义不同&#xff1a; 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别&#xff0c;逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 RS-232与RS-485对比 RS-422与RS-485对比 今天给大家分享的是&…...

win版ffmpeg的安装和操作

一、ffmpeg软件安装&#xff1a; ffmpeg是一个通过命令行将视频转化为图片的软件。 在浏览器搜索ffmpeg在官网里找到软件并下载&#xff08;不过官网很慢&#xff09;&#xff0c;建议用这个下载。 下载的文件是一个zip压缩包&#xff0c;将压缩包解压&#xff0c;有如下文件…...

力扣56. 合并区间

此题在技巧上需要掌握Lambda表达式&#xff0c;在 C 的 Lambda 表达式 中&#xff0c;[] 是 捕获列表&#xff08;capture list&#xff09;&#xff0c;用于指定 Lambda 表达式如何访问其外部作用域的变量。 [捕获列表](参数列表) -> 返回类型 {函数体 };• 捕获列表&…...

2024基于大模型的智能运维(附实践资料合集)

基于大模型的智能运维是指利用人工智能技术&#xff0c;特别是大模型技术&#xff0c;来提升IT运维的效率和质量。以下是一些关键点和实践案例&#xff1a; AIOps的发展&#xff1a;AIOps&#xff08;人工智能在IT运维领域的应用&#xff09;通过大数据分析和机器学习技术&…...

Android Java 版本的 MSAA OpenGL ES 多重采样

最近多次被小伙伴问到 OpenGL 多重采样&#xff0c;其实前面文章里多次讲过了&#xff0c;就是构建2个缓冲区&#xff0c;多重采样缓冲区和目标解析缓冲区。 代码流程 // Framebuffer IDs private int msaaFBO; private int msaaColorBuffer; private int msaaDepthBuffer;pr…...

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA&#xff08;自调制特征聚合模块&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。随着深度学习在计算机视觉中的不断进展&#xff0c;目标检测任务也在快速发展。YOLO系列模型&#xff08;You Onl…...

VMware虚拟机安装银河麒麟操作系统KylinOS教程(超详细)

目录 引言1. 下载2. 安装 VMware2. 安装银河麒麟操作系统2.1 新建虚拟机2.2 安装操作系统2.3 网络配置 3. 安装VMTools 创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄袭…...

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

手机发烫怎么解决?

在当今这个智能手机不离手的时代&#xff0c;手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感&#xff0c;长期过热还可能损害手机硬件、缩短电池寿命&#xff0c;甚至引发安全隐患。不过别担心&#xff0c;下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...

【Artificial Intelligence篇】AI 携手人类:共铸未来创作新纪元

引言&#xff1a; 随着科技的飞速发展&#xff0c;人工智能已逐渐渗透到各个领域&#xff0c;尤其是在创作领域&#xff0c;其与人类的合作展现出了前所未有的可能性和潜力。从艺术作品的生成到文学作品的创作&#xff0c;从复杂软件的开发到创新设计的构思&#xff0c;AI 正在…...

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则&#xff0c;开启外网访问WEB管理和SSH 前言 例如&#xff1a;随着人工智能的不断发展&#xf…...

Go快速开发框架2.6.0版本更新内容快速了解

GoFly企业版框架2.6.0版本更新内容较多&#xff0c;为了大家能够快速了解&#xff0c;本文将把更新内容列出详细讲解。本次更新一段时间以来大伙反馈的问题&#xff0c;并且升级后台安全认证机制&#xff0c;增加了RBAC权限管理及系统操作日志等提升后台数据安全性。 更新明细…...

条件语句 - if, else, switch-case

引言 条件语句是编程中用于根据不同的条件执行不同代码块的重要工具。C 提供了 if、else 和 switch-case 等条件语句&#xff0c;帮助程序员实现逻辑分支。本文将详细介绍这些条件语句的用法&#xff0c;并通过实例帮助读者更好地理解和掌握这些概念。 一、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: …...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...