C++子类父类成员函数的覆盖和隐藏实例详解

yizhihongxing

C++子类父类成员函数的覆盖和隐藏

覆盖(Override)

当子类定义了与父类相同名称、参数列表和返回类型的成员函数时,子类的成员函数会覆盖父类的同名函数,称之为覆盖。

实现方式是使用 override 关键字表明该函数是对基类函数的重写,子类中的该函数将取代基类中的同名函数。如果子类中未找到需要重写的函数,编译器会给出错误提示。

假设有一个基类 Shape,有 area() 成员函数,以及两个派生类 SquareCircle,都拥有自己的实现方式,具体代码如下:

#include <iostream>
using namespace std;

class Shape {
public:
   virtual double area() { // virtual表示此函数可被子类覆盖
      cout << "Shape class area" << endl;
      return 0;
   }
};

class Square: public Shape {
public:
   double area() override { // 对Shape中的area()进行重写
      cout << "Square class area" << endl;
      return 0;
   }
};

class Circle: public Shape {
public:
   double area() override { // 对Shape中的area()进行重写
      cout << "Circle class area" << endl;
      return 0;
   }
};

int main() {
   Shape *shape;
   Square square;
   Circle circle;

   shape = &square;
   shape->area();

   shape = &circle;
   shape->area();

   return 0;
}

输出结果为:

Square class area
Circle class area

需要注意以下几点:

  • 使用 virtual 关键字声明一个成员函数,表示这个成员函数可以被子类重写。
  • 在子类中,当你定义了一个与基类相同名称的成员函数时,该函数就自动地隐藏了基类中的成员函数。
  • 使用 override 关键字表明该函数是对基类函数的重写,可以增加可读性和代码安全,有效避免在子类时误拼写同名函数的情况。

隐藏(Hide)

子类如果有和父类同名函数,但参数不同,此时子类成员函数将会隐藏父类成员函数,称之为隐藏。

对于 C++ 中的隐藏,可以简单理解为父类中的同名成员函数被覆盖(隐藏),因为在子类中提供了新的成员函数。与覆盖不同的是,子类的新成员函数与父类的同名成员函数具有相同的名称,但就其功能而言,它们具有完全不同的实现。

以下是一个示例:

#include <iostream>
using namespace std;

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

class Rectangle : public Shape {
public:
    void draw() {
        cout << "Rectangle draw function." << endl;
    }
};

class Square : public Shape {
public:
    void draw(int n) {
        cout << "Square draw function, side = " << n << endl;
    }
};

int main() {
    Shape *s;
    Rectangle r;
    Square s1;

    s = &r;
    s->draw();

    s = &s1;
    s->draw();

    return 0;
}

输出结果为:

Rectangle draw function.
Shape draw function.

需要注意以下几点:

  • 在派生类中重新定义了与基类中同名而切参数不相同的成员函数,就称该派生类中的成员函数隐藏了基类成员函数。
  • 如果希望在子类中仍然能调用被隐藏的父类成员函数,可以使用作用域解析运算符 ::,例如 Rectangle::draw() 即可访问基类的 draw() 函数。

总结

  • 子类如果有和父类同名函数,但参数不同,此时子类成员函数将会隐藏父类成员函数,称之为隐藏。
  • 子类定义了继承自父类的同名函数,该子类函数会覆盖父类中的成员函数,称之为覆盖。
  • 覆盖是一个特殊的隐藏。
  • 覆盖要求子类成员函数和父类成员函数的名称、参数列表和返回类型完全一致。
  • 在子类中,可以使用 override 关键字明确指定成员函数是对基类中的同一成员函数的重载,增加代码的可读性和安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++子类父类成员函数的覆盖和隐藏实例详解 - Python技术站

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

相关文章

  • GTA5 PC版股票错乱BUG怎么办 GTA5 PC版股票错乱BUG解决方法

    下面我将为大家详细讲解GTA5 PC版股票错乱BUG的解决攻略。 1. 了解问题 首先,我们要了解这个问题的具体表现。GTA5的PC版在玩股票时,存在一种股票价格错乱的情况,就是明明是某一支股票的名字,但是其价格却对应了另一支股票的价格。这对于股票交易的玩家来说是非常不利的,因此我们需要找到解决这个问题的方法。 2. 解决方法 2.1. 清空游戏缓存 这是解…

    other 2023年6月27日
    00
  • matlab语谱图(时频图)绘制与分析

    MATLAB语谱图(时频图)绘制与分析 简介 语谱图(时频图)是用于分析随时间变化的信号的谱表示。它可以显示信号随时间的变化和不同频率分量的能量。在 MATLAB 中,我们可以使用 Signal Processing Toolbox 中的函数来绘制语谱图并进行分析。 准备工作 在绘制语谱图之前,需要先准备一个待处理的信号。一般情况下,这个信号可以是声音、图像…

    其他 2023年3月29日
    00
  • 全面解析C++中的析构函数

    全面解析C++中的析构函数 什么是析构函数 在C++中,当一个对象的生命周期结束时,即它不再被使用时,就会调用该对象的析构函数。析构函数是一种特殊的成员函数,用于在对象销毁前执行一些清理工作。 析构函数的语法 析构函数的名称与类名相同,前面加上一个波浪号(~),不需要参数和返回值。例如: class MyClass { public: ~MyClass();…

    other 2023年6月26日
    00
  • 简单聊聊md5和sha-256加密

    简单聊聊md5和sha-256加密 在计算机安全领域,加密是一种常见的技术,用于保护数据的安全性。MD5和SHA-256是两种常见的加密算法,本攻略将详细介绍这两种算法的原理和用法,并提供两个示例。 MD5加密 MD5是一种常见的哈希函数,用于将任意长度的消息压缩成一个128位的哈希值。MD5算法的原理是将消息分成512位的块,并对每个块进行一系列的操作,最…

    other 2023年5月9日
    00
  • ApplicationListenerDetector监听器判断demo

    首先,我们需要了解什么是ApplicationListenerDetector监听器。ApplicationListenerDetector监听器是Spring框架中的一个监听器,用于监听ApplicationEvent事件的触发。我们可以通过它来判断Spring容器中是否存在特定的监听器。 接下来,我们需要实现一个ApplicationListenerDe…

    other 2023年6月27日
    00
  • 微信小程序 配置文件详细介绍

    下面是“微信小程序配置文件详细介绍”的完整攻略。 微信小程序配置文件详细介绍 引言 在微信小程序开发中,配置文件十分重要。配置文件可用于配置小程序的全局变量、页面路径、底部tabbar等功能,可以帮助我们更好的管理和维护小程序。接下来,我们将详细介绍微信小程序配置文件的使用。 全局配置文件 小程序的全局配置文件为 app.json,用于配置全局性的属性,如小…

    other 2023年6月25日
    00
  • Vue路由切换页面不更新问题解决方案

    当使用Vue.js进行单页应用开发时,我们经常会使用Vue Router来实现路由切换。但是,有时候在切换路由时,页面并没有更新,这很可能是因为使用了相同的组件。下面是解决这个问题的完整攻略: 问题描述 使用Vue Router切换页面时,发现页面没有更新,但是路由确实已经切换了。我们在页面中进行各种操作,也不会触发重新渲染组件的过程。 分析问题 这个问题通…

    other 2023年6月26日
    00
  • 使用360清理大师压缩照片节省您宝贵的空间

    使用360清理大师压缩照片节省您宝贵的空间攻略 介绍 360清理大师是一款功能强大的手机清理和优化工具,它提供了照片压缩功能,可以帮助您节省手机存储空间。以下是使用360清理大师压缩照片的完整攻略。 步骤 下载和安装360清理大师:首先,在您的手机应用商店中搜索并下载360清理大师应用。安装完成后,打开应用并按照提示进行初始化设置。 进入照片压缩功能:在36…

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