C++ 98/03 应该学习哪些知识14

c++入门到精通教程 c++11/14/17-王健伟-专题视频课程 本教程适合那些只有一点点c语言编程知识的新手,也适合那些c++98标准已经掌握的不错但对c++11/14/17新标准基本无所知的c++开发老手,欢迎大家尽早加入学习,请大家从授课目录,讲解课程时长、演示范例详尽程度,试听后收获四个方面评估本教程的质量。... 阅读详情

重载、重写和覆盖

C++中的重载(overloading)、重写(override)和覆盖(overriding)是三个重要的概念,它们在C++语言中都有着不同的意义和用法。在本文中,我们将详细解释这三个概念的含义,并用代码举例说明它们的使用方法和场景。

重载(Overloading)

重载是指在同一作用域内定义多个同名但参数列表不同的函数或操作符。例如,我们可以定义如下的两个函数:

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

这两个函数都被命名为 add,但它们的参数列表不同,一个接受两个整数,一个接受两个浮点数。这样,我们就可以通过函数名调用不同类型的 add 函数,而不必使用不同的函数名。

重载的优势在于可以提高代码的可读性和灵活性,让程序员更容易理解代码的含义和作用。但需要注意的是,重载时必须确保不同的函数或操作符具有不同的参数列表或参数类型,否则编译器无法区分它们。

重写(Override)

重写是指子类(派生类)重新定义父类(基类)的虚函数,以改变其行为。在C++中,通过将基类的虚函数标记为 virtual 来实现重写。例如:

class Shape {
public:
    virtual double area() {
        return 0;
    }
};

class Circle : public Shape {
public:
    double area() override {
        return 3.14 * radius * radius;
    }
private:
    double radius;
};

在上面的例子中,Shape 类定义了一个虚函数 area(),返回值为0,而 Circle 类继承自 Shape 类,并重写了 area() 函数,用于计算圆形的面积。通过在子类中重新定义父类的虚函数,我们可以改变该函数的行为,并根据需要进行修改。

覆盖(Overriding)

覆盖是指在派生类中使用与基类相同名称的函数或操作符来隐藏基类的同名函数或操作符。例如:

class Shape {
public:
    virtual double area() {
        return 0;
    }
};

class Circle : public Shape {
public:
    double area() {
        return 3.14 * radius * radius;
    }
private:
    double radius;
};

在上面的例子中,Circle 类中的 area() 函数与 Shape 类中的 area() 函数同名。由于 Circle 类中的 area() 函数没有被标记为虚函数,因此它将隐藏 Shape 类中的 area() 函数。如果我们创建一个 Circle 类的对象并调用 area() 函数,将会调用 Circle 类中的函数而不会调用 Shape 类中的函数。这种行为被称为覆盖。

需要注意的是,在覆盖时必须确保函数的名称和参数列表与基类相同,否则将无法实现覆盖。此外,在覆盖时也可以使用 virtual 关键字,但这并不是必须的。

代码示例

下面通过一个简单的示例来展示重载、重写和覆盖在实际项目中的应用。

假设我们正在开发一个简单的图形库,其中包含各种形状的类。我们定义了一个 Shape 基类,其中包含一个名为 draw() 的虚函数,用于在屏幕上绘制该形状。我们还定义了一个 Circle 类和一个 Rectangle 类,它们都继承自 Shape 类,并实现了自己的 draw() 函数。

#include <iostream>

class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape\n";
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle\n";
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a rectangle\n";
    }
};

接下来,我们在主函数中创建了一个 Shape 类的指针,并将其分别指向 Circle 类和 Rectangle 类的对象。然后调用了它们的 draw() 函数,观察输出结果。

int main() {
    Shape* pShape;

    Circle circle;
    Rectangle rectangle;

    pShape = &circle;
    pShape->draw();

    pShape = &rectangle;
    pShape->draw();

    return 0;
}

输出结果如下:

Drawing a circle
Drawing a rectangle

在这个示例中,我们使用了重写和覆盖的概念来实现多态性。当我们将 Shape 类的指针指向 Circle 类或 Rectangle 类的对象时,实际调用的是子类中的 draw() 函数,而不是基类中的函数。这种行为能够提高代码的可扩展性和可维护性,让程序员更容易添加新的形状类或修改已有的形状类的行为。

总结

在本文中,我们介绍了C++中的重载、重写和覆盖这三个概念的含义和使用方法,并通过实际代码示例深入理解了它们的实际应用。重载能够提高代码的可读性和灵活性,重写和覆盖能够实现多态性和代码的可扩展性。在实际项目中,我们应该充分利用这些概念来设计和开发高质量的C++程序。

C++98与C++14:时代变迁下的编程语言进化 在编程世界中,C++无疑是一种强大且流行的语言。自其诞生以来,C++已经经历了多个版本的迭代和更新,其中C++98和C++14是两个具有里程碑意义的版本。本文将详细介绍这两个版本之间的区别,帮助读者更好地理解C++语言的进化历程。 阅读详情

相关推荐

C++98,C++11、C++14 和 C++17,C++20,我应该用哪个C++标准?

这些只是C++17引入的一些新特性的概要介绍,还有其他一些细微的语言改进和库的改进。如果你在遗留代码或旧项目中工作,并且使用的是较旧的编译器,那么C++98可能是你的选择。2. 统一的初始化语法:引入了统一的初始化语法,可以使用花括号来初始化变量和对象,避免了一些初始化相关的问题。3. 右值引用和移动语义:引入了右值引用(&&)和移动语义,可以实现高效的资源管理和移动语义,提高程序的性能。6. 强制拷贝消除:通过引入新的规则,C++17中的编译器可以自动优化掉不必要的拷贝操作,提高程序的性能。

xcksj888的博客 2422

C++03 标准详解:C++98的技术修订版

C++03是C++98的技术修订版本,主要修正语言缺陷而非引入新特性。该标准澄清了容器成员函数的异常安全性、流状态处理、模板规则和初始化语法等100多处问题,增强了标准库规范,改善了与C99的兼容性,并统一了类型定义和名称查找规则。虽然变化细微,但C++03提高了语言的稳定性和可移植性,为后续C++11的重大更新奠定了基础。关键改进包括模板特化规则、值初始化语法和标准库头文件补充等。

C++发展史系列已完结,这段时间将会迎来系列作品——C++STL系列,敬请期待。作者邮箱:ljq20110324@outlook.com 684

深入解析C++的演进:C++98到C++17

C++作为一门历史悠久的编程语言,其标准的演进是多年来编程实践不断进步和技术创新的集中体现。从最初于1983年被命名以来,C++经历了数个标准的迭代更新,每一个版本都为语言的表达能力、性能、安全性和易用性带来了重大改进。本章将概述C++从其诞生到现在主要标准的演进脉络,为读者揭示这一编程语言不断自我完善和发展的历程。首先,C++语言在1985年被Bjarne Stroustrup设计出来,并在1989年首次以“C with Classes”发布。随后,在1998年正式成为ISO标准,即C++98。

weixin_35935514的博客 1243

C++ 98/03 应该学习哪些知识17

内存溢出和内存泄漏

clayhell的博客 1204

C++98/C++03/C++11/C++14/C++17/C++20 标准帮助文档 2020-09-04

C++98/C++03/C++11/C++14/C++17/C++20 标准帮助文档,更新于 2020 年 9 月 4 日。docsets 格式,可使用 zeal 软件查看

在Ansys Mechanical中对磨损进行建模

在有限元分析中,磨损是通过移动接触表面上的节点来复制材料侵蚀来建模的。仿真迭代更新几何,并在每次更新后重新计算平衡,使过程成为非线性的。Ansys使用将压力、相对运动和材料阻力与表面损失联系起来的经验定律来处理连续介质尺度的磨损。要在Ansys Mechanical中激活磨损建模,必须使用TB,WEAR命令定义专用材料模型。该命令与 TBDATA 相结合,允许用户输入与磨损相关的材料常数,以控制磨损的计算方式以及在接触表面上的应用方式。

jkh920184196的博客 2631

C++ 98/03 应该学习哪些知识6

内存中的栈和堆分配

clayhell的博客 923

无线网卡选购指南:哪些型号支持Kali Linux的监听模式?附免驱动网卡推荐

本文详细解析了如何在Kali Linux下选购支持监听模式的无线网卡。核心在于选择兼容的芯片组,如Atheros AR9271和Ralink RT3070等经典型号,并提供了免驱动网卡推荐与实战配置指南,帮助安全研究人员和爱好者快速搭建无线测试环境。

wind6的博客 1563

C++ 98/03 应该学习哪些知识8

访问限定符 public/protected/private

clayhell的博客 959

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7710

拆解人形机器人:核心硬件与驱动系统

本文深入解析人形机器人的核心硬件系统,将其类比为"骨骼+肌肉+神经"的集成体。重点介绍了三大关键组件:驱动单元(无框力矩电机和空心杯电机)、传动单元(谐波减速器和行星滚柱丝杠)以及感知单元(力矩传感器、编码器和IMU)。文章指出一体化关节模组正成为行业趋势,能够实现更紧凑的结构和更高的可靠性。同时分析了硬件价值量分布,强调丝杠、电机等部件是当前技术高地和成本重心。最后指出随着技术进步,机器人价值将更多向"大脑"和"神经"转移。

小明的博客 1530

C++ 98/03 应该学习哪些知识16

RAII 与 pimpl 惯用法

clayhell的博客 1157

点云体积计算方法之一 附python代码

另外需要注意,这个只适合点云密集分布的场景来计算体积,比如树木扫描的体积;如果只是有表面积扫描的点云,该方法就不能计算整个物体的体积了。通过计算点云所占用的体素的数量来计算点云的近似体积。这是一个非常粗略的近似值,对于复杂的形状可能不准确。

三维点云技术探索 1888

C++ 的史诗级进化:从C++98到C++20

C++ 的史诗级进化:从C++98 - C++20 详解,含示例

不休的博客 1541

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1213

C++98/03版本知识点汇总

1.类只在代码中出现,不会在运行的程序中出现,即编译时出现;对象在运行的程序中出现,并占用内存,是运行的实体; 2.消息传递的实质是方法的调用; 3.面向对象最突出的特征是:封装性、继承性、多态性 封装:将数据结构和作用在数据结构上的操作组成一个实体,单位是对象,提供动态代码共享; 继承性:提供静态的代码共享; 多态性:不同的对象收到相同的消息产生多种不同的行为方式 编译时的多态性:通

忘世麒麟的专栏 3220

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C/C++】C语言&C++标准版本+不同版本的新特性(C89/90、C95、C99、C11、C17;C++98、C++03、C++11、C++14、C++17、C++20)(截止到2023年)

C语言:C89/90、C95、C99、C11、C17;C++:C++98、C++03、C++11、C++14、C++17、C++20;列出每个版本的一些主要特性。

crr411422的博客 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C发展史:K&R C/C89/C99/C11 以及 C++发展史: C++98/C++03/C++11

C语言的发展阶段 C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。 20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell Labora

Invoker's Tower 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++学习(十)(标准,C++11 和 C++14,C++17,C++20)

这段代码像**“智能厨房点单”**——主线程下单后继续干活,协程默默计时处理,最后交付结果,高效利用等待时间!🕒👨🍳和 关键字。

solomonzw的博客 2041

C++11/14/17 学习书籍推荐

时至今日,C++11/14/17 新标准慢慢成为 C++ 开发主流,建议熟悉新标准新增的一些实用特性。相比较 C++98/03,C++11 是变化和改动最多的一个版本,新增和改善了大量新语言特性和实用功能,而 C++14/17 通常认为是对 C++11 的进一步完善和休憩,所以学习的话建议还是以学习 C++11 新增的特性为主。左值/右值/std::move/std::forward。

张小方的博客 1131

VS版本、GCC版本与C++版本的对应关系

做嵌入式开发经常遇到一些编译器和C++版本不匹配的问题,现整理如下: 目前C语言的标准有:C89(ANSI C)、C90、C95、C99(ISO C)、C11(C1x) 目前C++语言的标准有:C++98、C++03(对98小幅修改)、C++11(全面进化)、C++14、C++17 C语言标准的介绍,请参考:C语言标准简介C89(ANSI C)、C99(ISO C)、C11(C1x) 各...

Captain--Jack 4万+

【C++学习】C++入门知识(上)

介绍了C++在C基础上扩展出来的一些基本语法,包括命名空间,缺省参数,函数重载等内容。

weixin_63726869的博客 4728

c++ 发展历程

##C++ 发展历程: C++98 到 C++03 到 C++11 到 C++14 到 C++17 1 C++语言发展大概可以分为三个阶段: 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言, 并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额; 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现 ,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模

jisuanji198509的博客 3101

C++98&C++11的区别

C++98&C++11的区别 文章目录C++98&C++11的区别1. C++11简介2. 自动类型推导auto3. 列表初始化4. 变量类型推导5. 范围for循环6. 返回类型后置语法7. final和override8. =default和=delete9. lambda表达式10. std::move11. std::array12. std::forward_list13...

wolfGuiDao的博客 9143
上一篇: C++ 98/03 应该学习哪些知识13
下一篇: C++ 98/03 应该学习哪些知识15
五百五。
博客等级 码龄7年 249粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值