C++中的覆盖和隐藏详解

C++中的覆盖和隐藏详解

在C++中,派生类可以继承父类的成员函数。当派生类中的函数与父类中的函数同名时,就会产生覆盖和隐藏的问题。下面就来详细讲解一下C++中的覆盖和隐藏。

覆盖(Override)

覆盖指的是派生类中的函数与父类中的函数同名、同参数列表,且返回类型相同。此时,派生类中的函数将覆盖掉父类中的函数,成为继承关系中的新定义。

在派生类的成员函数中,使用virtual关键字可以指定该函数为虚函数,从而实现覆盖。派生类中的覆盖函数可以使用override关键字来显式的表明这是一个覆盖函数,这样可以方便编译器检查是否真正的进行了覆盖。

示例代码如下:

#include <iostream>
using namespace std;

class Shape {
public:
    virtual void draw() {
        cout << "Drawing Shape" << endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        cout << "Drawing Circle" << endl;
    }
};

int main() {
    Shape *s = new Circle;
    s->draw();  // 输出 "Drawing Circle"
    delete s;
    return 0;
}

在上述代码中,Shape类中的draw()函数被声明为虚函数,且其有一个派生类Circle,在Circle类中重写了基类函数draw(),用于绘制圆形。在main函数中,通过将一个Circle类的对象指针转为一个基类指针用以调用Shape类中的虚函数draw(),结果输出了"Drawing Circle"表示执行了Circle类的draw()函数。

隐藏(Hide)

隐藏指的是派生类中的函数与父类中的函数同名,但参数列表不同。此时,派生类的函数将隐藏父类的同名函数,不再具有覆盖父类同名函数的功能。

示例代码如下:

#include <iostream>
using namespace std;

class Shape {
public:
    void draw() {
        cout << "Drawing Shape" << endl;
    }

    void draw(int num) {
        cout << "Drawing " << num << " Shapes" << endl;
    }
};

class Circle : public Shape {
public:
    void draw() {
        cout << "Drawing Circle" << endl;
    }

    void draw(double radius) {
        cout << "Drawing Circle with radius " << radius << endl;
    }
};

int main() {
    Shape s;
    Circle c;
    s.draw();           // 输出 "Drawing Shape"
    s.draw(2);          // 输出 "Drawing 2 Shapes"
    c.draw();           // 输出 "Drawing Circle"
    c.draw(2.5);        // 输出 "Drawing Circle with radius 2.5"
    // c.draw(2);      // 编译错误,因为Circle类中没有draw(int)函数,只有draw(double)。
    return 0;
}

在上述代码中,Shape类中的draw()函数有两个重载版本,一个是无参的版本,一个是带有一个int类型参数的版本。Circle类中也有一个同名函数draw(),但没有重载draw(int)函数,反而增加了一个带有一个double类型参数的函数。在main函数中,Shape类和Circle类各调用两个版本的draw()函数,而Circle类的调用中没有使用到int类型版本的函数,由于派生类的函数名与基类函数名相同但参数列表不同,Circle类中重载的draw(double)函数隐藏了基类中的所有draw()函数。

以上就是C++中的覆盖和隐藏的详细讲解。其中,覆盖是实现多态性的关键机制之一,隐藏则不利于代码的调试和维护,应尽量避免使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的覆盖和隐藏详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Python编写带选项的命令行程序方法

    当需要编写一个 Python 版本的命令行程序时,应该考虑添加命令行选项,以增加程序的可扩展性和易用性。 一般来说,命令行选项的参数分为两种形式:短选项和长选项。短选项通常用单个字符表示,例如 -v;而长选项则是由单词或单词组成,例如 –version。 下面分步骤解释如何在 Python 中编写带选项的命令行程序: 1.导入 Python 的内置 arg…

    other 2023年6月26日
    00
  • vue之二级路由

    当然,我很乐意为您提供有关“Vue之二级路由”的完整攻略。以下是详细的步骤和两个示例: 1 二级路由 在Vue中,可以使用Vue Router来实现路由功能。二级路由是指在一个路由下再嵌套一个路由,也就是说,一个路由可以有多个子路由。 2 示例 以下是两个二级路由的示例: 2.1 创建二级路由 要创建二级路由,可以使用以下步骤: 在Vue Router中定义…

    other 2023年5月6日
    00
  • 使用Folx下载任务完成后,怎么自动完成关闭

    使用Folx下载任务完成后,如何自动完成关闭 Folx是一款功能强大的下载工具,可以帮助用户下载各种文件,包括音乐、视频、软件等等。在使用Folx下载任务之后,有时候希望自动关闭Folx,以便释放资源。本文将介绍如何设置Folx,让其在下载任务完成后自动关闭。 步骤一:打开Folx偏好设置 首先,在Folx菜单栏中选择“Folx” > “偏好设置”。或…

    其他 2023年3月28日
    00
  • 删除SVN三种方法delSvn(windows+linux)

    删除SVN三种方法 delSvn(windows+linux) 攻略 简介 SVN(Subversion)是目前较为流行的版本控制系统之一。但是,在进行项目开发过程中,我们有时候需要删除SVN,这篇文章主要介绍了如何通过三种不同的方法来删除SVN。本文将提供适用于Windows和Linux操作系统的delSvn代码示例,支持快速高效地删除SVN。 方法一:使…

    other 2023年6月27日
    00
  • [EasyUI美化换肤]更换EasyUi图标

    EasyUI是一款基于jQuery的UI框架,提供了丰富的UI组件和易于使用的API,可以帮助开发人员快速构建Web应用程序。本文将详细讲解如何更换EasyUI图标,包括使用自定义图标和使用FontAwesome图标库,并提供两个示例说明。 使用自定义图标 使用自定义图标可以让我们更好地控制EasyUI的外观,可以根据自己的需求来定制图标。下面是使用自定义图…

    other 2023年5月5日
    00
  • 深入浅析 Android Fragment(上篇)

    深入浅析 Android Fragment(上篇) 何谓Fragment Fragment是Android中一种独立模块的组件,其类似于Activity,可以包含UI界面和交互逻辑,但与Activity不同的是,Fragment是不能单独存在的,它必须依附于Activity才能存在。 Fragment的生命周期 Fragment的生命周期是指Fragment…

    other 2023年6月27日
    00
  • 深入了解Go项目标准目录布局

    深入了解Go项目标准目录布局攻略 Go语言拥有一套标准的项目目录布局,这有助于提高代码的可读性、可维护性和可扩展性。本攻略将详细介绍Go项目标准目录布局,并提供两个示例说明。 1. 项目目录结构 一个典型的Go项目目录结构如下所示: myproject/ ├── cmd/ │ └── myapp/ │ └── main.go ├── pkg/ │ └── m…

    other 2023年9月5日
    00
  • 逆水寒素问技能进阶搭配图文介绍 素问技能进阶优先级顺序

    逆水寒素问技能进阶搭配攻略 1. 简介 《逆水寒》是一款古风题材的网游,其中素问技能是重要的战斗技能之一。本攻略将详细介绍素问技能进阶的优先级顺序,并给出两个示例说明。 2. 优先级顺序 在进行素问技能进阶搭配时,可以按照以下优先级顺序进行选择: 2.1 主动技能优先 主动技能通常具有较高的输出能力和战略价值,因此应该优先考虑选择主动技能进行进阶。 2.2 …

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部