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

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日

相关文章

  • 深入解析PHP的Yii框架中的缓存功能

    深入解析PHP的Yii框架中的缓存功能攻略 介绍 Yii框架是一个高性能的PHP框架,提供了丰富的功能和组件,其中包括了强大的缓存功能。本攻略将详细介绍Yii框架中的缓存功能,并提供两个示例说明。 缓存的作用 缓存是一种将计算结果或数据存储在临时存储中的技术,以便在后续的请求中快速获取。使用缓存可以大大提高应用程序的性能和响应速度。 Yii框架中的缓存组件 …

    other 2023年7月28日
    00
  • Go语言中定时器cron的基本使用教程

    Go语言中定时器cron的基本使用教程 介绍 在Go语言中,我们可以使用cron定时器来执行定时任务。Cron是一个基于时间的调度器,它允许我们按照指定的时间间隔或时间点来执行任务。 安装 要使用cron定时器,我们需要先安装cron库。可以使用以下命令来安装cron库: go get github.com/robfig/cron 基本用法 下面是cron定…

    other 2023年8月20日
    00
  • vue设置路由title,但刷新页面时title失效的解决

    在Vue项目中,如果使用了vue-router进行路由管理,那么设置路由的标题常常是必要的。但是在刷新页面时,路由标题会失效,这是因为刷新页面会重新加载所有资源,包括Vue实例和路由相关的资源。为了解决这个问题,需要进行以下操作: 使用Vue Router的导航守卫 Vue Router提供了导航守卫(navigation guard)来处理路由变化前、后、…

    other 2023年6月27日
    00
  • mysqldump下载

    以下是关于如何使用mysqldump下载MySQL数据库的详细攻略: 步骤一:安装MySQL 在使用mysqldump下载MySQL数据库之前,您需要先安装MySQL。您可以从MySQL官网下载MySQL安装程序按照安装程序的指示进行安装。 步骤二:打开命令行 在Windows上,您可以按下Win+R键打开行对话框,后输入“cmd”并按下Enter键打开命令…

    other 2023年5月7日
    00
  • vue实现全选组件封装实例详解

    我们提到Vue实现全选组件的封装,涉及到以下几个步骤: 设计组件props 在设计组件props时,我们首先考虑用户使用该组件时,可能需要的配置选项。在该例子中,我们需要考虑以下props: selectedItems:表示当前选中的项,可以是一个数组或者一个对象。 allItems:表示所有可选项,同样可以是一个数组或者一个对象。 itemKey:表示可选…

    other 2023年6月25日
    00
  • iPad成为Windows系统的第二屏幕

    iPad成为Windows系统的第二屏幕 在日常生活和工作中,我们经常需要使用多个显示器来提高我们的工作效率。但是使用多个物理显示器常常需要大量的成本,特别是对于刚刚开始工作的人们来说。因此,越来越多的人开始寻找可以替代多屏幕的解决方案。 近年来,iPad成为了一个非常受欢迎的设备,其在轻便、易于携带以及优秀的屏幕分辨率等方面具有很大的优势。同时,iPad的…

    其他 2023年3月28日
    00
  • android中的matrix(矩阵)

    Android中的Matrix(矩阵) 在Android开发中,我们经常需要对UI进行各种变换,比如旋转、缩放、平移等。而Matrix的作用就是完成这些变换。 Matrix简介 Matrix,翻译为矩阵,是一个含有9个元素的数组对象,它是用来实现图形变换的重要工具。在Android中,我们可以通过Matrix来完成各种图形变换,比如平移、旋转、缩放、倾斜等操…

    其他 2023年3月29日
    00
  • Pyinstaller打包文件太大的解决方案

    PyInstaller是一个开源的第三方库,用于将Python代码转换成可以在不安装Python的情况下运行的可执行文件,但是有时候打包出来的文件很大,不便于传输和使用。下面是PyInstaller打包文件太大的解决方案的完整攻略。 1.使用UPX压缩可执行文件 UPX是一个开源的可执行文件压缩工具,可以将文件大小压缩至原始大小的50%左右,同时不会影响可执…

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