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

yizhihongxing

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日

相关文章

  • Win10系统资源管理器不明原因崩溃怎么办 Win10资源管理器频繁崩溃的解决办法

    Win10系统资源管理器不明原因崩溃怎么办 Win10系统资源管理器是我们经常使用的一个功能,但是有时候它会出现不明原因的崩溃现象,这时候我们该怎么办呢?本文将为大家提供一些有效的解决方法。 解决步骤 步骤一:查看系统更新 有时候Win10系统资源管理器崩溃的原因是因为系统未及时更新。因此,首先我们需要检查系统更新是否完全。 点击“开始”菜单,在搜索栏中输入…

    other 2023年6月27日
    00
  • securecrt8.3版本激活码

    以下是“SecureCRT 8.3版本激活码”的完整攻略: SecureCRT 8.3版本激活码 SecureCRT是一款用于SSH和Telnet客户端软件,可以用于远程连接服务器。以下是如何获取SecureCRT 8.3版本激活码的步骤: 1. 下载SecureCRT 8.3 首先,您需要下载SecureCRT 8.3软件。您可以从官方网站下载Secure…

    other 2023年5月7日
    00
  • 电脑桌面鼠标右击没有任何反应怎么解决?

    问题描述: 电脑桌面鼠标右击没有任何反应 解决步骤: 检查鼠标设置 右击我的电脑,选择“属性”,在弹出的窗口中点击“高级系统设置”,再选择“高级”选项卡,在“性能”一栏中点击“设置”按钮,弹出“性能选项”窗口,在这个窗口中确认“启用桌面成像的顺畅滚动”选项勾选上,然后点击“应用”和“确定”按钮保存设置。 重新连接鼠标或尝试用其他鼠标进行操作。 检查系统设置 …

    other 2023年6月27日
    00
  • 无法格式化F盘显示此驱动器正在使用怎么解决?

    首先,要解决“无法格式化F盘显示此驱动器正在使用”这个问题,我们需要先确认F盘是否被占用。可以尝试打开F盘并检查其中的文件、文件夹是否被占用或者打开一个命令提示符窗口,使用命令“net use”查看与F盘相关的网络连接情况。 如果F盘没有被占用,那么就有可能是因为F盘中的文件系统出现了问题。这时候,我们可以尝试对F盘进行修复。具体的修复操作可以参考以下步骤:…

    other 2023年6月27日
    00
  • iOS中各种UI控件属性设置示例代码

    下面就是详细讲解“iOS中各种UI控件属性设置示例代码”的完整攻略。 1. UILabel 属性设置 1.1 设置字体大小和颜色 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; label.text = @"Hello World"; …

    other 2023年6月26日
    00
  • java获取当前目录方法整理

    Java获取当前目录方法整理 在Java中,获取当前目录是一项常见的任务。本文将介绍几种获取当前目录的方法,并提供两个示例说明。 方法一:System.getProperty() System.getProperty()方法可以获取当前工作目录。以下是一个示例: String currentDirectory = System.getProperty(&qu…

    other 2023年5月7日
    00
  • Win10系统电脑鼠标点击文件夹没反应该怎么办?

    Win10系统电脑鼠标点击文件夹没反应该怎么办? 问题描述 在使用 Win10 系统的电脑时,有时候会出现点击文件夹没有反应的情况。这种情况可能会出现在多个文件夹中,并且也会影响到用户的正常使用体验。 可能原因 Windows Explorer 进程出现异常。 文件夹选项设置错误。 电脑存在病毒或恶意软件导致。 系统文件损坏。 解决方法 方法一:重启 Win…

    other 2023年6月27日
    00
  • Android数据库相关整理

    Android数据库是Android应用程序中常用的数据存储方式之一。它可以帮助我们存储和管理应用程序中的数据,包括用户信息、应用程序配置、应用程序状态等。本文将介绍Android数据库相关的整理攻略,包括SQLite数据库、Room数据库、GreenDAO数据库等,以及它们的使用方法和示例说明。 1. SQLite数据库 SQLite是Android系统中…

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