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

news/2024/11/24 13:23:44/

重载、重写和覆盖

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++程序。


http://www.ppmy.cn/news/36678.html

相关文章

【基础算法】哈希表

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…

Spring Boot Aop初接触

AOP&#xff08;面向切面编程&#xff09;&#xff0c;或多或少都听过一点。名字比较怪&#xff0c;切面&#xff0c;不容易理解&#xff0c;但其中真正含义&#xff0c;无非就是旁路控制&#xff0c;非侵入式编码之类。比如我想加个操作日志功能&#xff0c;利用AOP&#xff0…

Java实现一个简单的东南西北中的面板

目录 一、前言 二、代码部分 1.代码 三、程序运行结果&#xff08;面板弹出&#xff09; 四、涉及到的知识点代码 一、前言 1.本代码是我在上学时写的&#xff0c;有一些地方没能完美实现&#xff0c;请包涵也请多赐教&#xff01; 2.本弹窗界面可以根据简单的要求进行…

【论文速递】ACL 2022 - 查询和抽取:将事件抽取细化为面向类型的二元解码

【论文速递】ACL 2022 - 查询和抽取&#xff1a;将事件抽取细化为面向类型的二元解码 【论文原文】&#xff1a;Query and Extract: Refining Event Extraction as Type-oriented Binary Decoding 【作者信息】&#xff1a;Wang, Sijia and Yu, Mo and Chang, Shiyu and Sun,…

MCAL知识点(七):GPT驱动配置详解

目录 1、概述 2、EB-tresos配置 2.1、GPT配置 2.2、TOM配置 2.3、中断配置 3、代码执行

【Python4CFD】笔记step5-8

CFDpython - 12 steps to N-S equation 承接上文&#xff0c;这是step5-8&#xff0c;相当于课程的第二阶段&#xff0c;这一阶段主要是讲2维的&#xff0c;先老实把链接放在这&#xff1a; 课程链接CFD Python, a.k.a. the 12 steps to Navier-Stokes视频链接ME702-Youtube …

我们现在怎样做父亲

离开了中学的课本后再没读过鲁迅的文章&#xff0c;今年想再读鲁迅。《我们现在怎样做父亲》这个题目本是鲁迅《坟》杂文集中的一篇&#xff0c;怎样做父亲是个人生大命题&#xff0c;毕竟一生中在这件事上不太能靠积累经验来熟练。所以&#xff0c;在做父亲这件事上不是一个技…

智能驾驶芯片赛道混战:如何看待5类玩家的竞争格局?

智能驾驶芯片赛道&#xff0c;一直是业内关注的焦点。 高工智能汽车注意到&#xff0c;针对L0-L2&#xff0c;业内基本采用智能前视一体机&#xff08;IFC&#xff09;方案&#xff1b;要实现高速NOA、城市NOA等更为高阶的智驾功能等&#xff0c;则基本采用域控制器方案。从IF…