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 关键字明确指定成员函数是对基类中的同一成员函数的重载,增加代码的可读性和安全性。
阅读剩余 65%

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

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

相关文章

  • Spring Boot解决项目启动时初始化资源的方法

    使用Spring Boot时,我们可能需要在项目启动时初始化一些资源,例如数据库连接池、缓存等。这些资源的初始化需要在应用程序启动时执行,并在应用程序关闭时销毁。 在Spring Boot中,我们可以使用以下三种方法来实现这一目标: 实现InitializingBean和DisposableBean接口 Spring提供了InitializingBean和D…

    other 2023年6月20日
    00
  • Cucumber常用关键字

    Cucumber是一种行为驱动开发(BDD)工具,它使用自然语言来描述软件的行为。在Cucumber中,关键字是用于描述测试场景和步骤的特殊单词。本文将详细讲解Cucumber常用关键字,包括Given、When、Then、And和But。同时,本文还提供了两个示例说明。 Given Given关键字用于描述测试场景的前置条件。它通常用于设置测试环境和准备测…

    other 2023年5月5日
    00
  • PHP MYSQL简易交互式站点开发

    PHP MYSQL简易交互式站点开发 – 完整攻略 简介 本攻略将介绍如何使用PHP和MYSQL开发交互式站点。我们将使用PHP来处理后端逻辑,MYSQL来存储数据等详细步骤。 步骤 步骤1:环境搭建 运行PHP和MYSQL,可以通过在本地电脑上安装WAMP或XAMPP来快速搭建基本的环境。 步骤2:创建数据库 打开MYSQL命令行,并创建一个数据库。如: …

    other 2023年6月27日
    00
  • asp之字符串函数示例

    下面是详细的攻略: 概述 在ASP中,字符串处理是一个非常基础的操作。为了方便处理字符串,ASP提供了许多字符串函数。本文将会介绍ASP中常见的字符串函数,并给出两个实际的示例。 ASP字符串函数 以下是ASP中常见的字符串函数: Len(string):返回指定字符串的长度。 Left(string, length):返回指定长度的左边字符。 Right(…

    other 2023年6月20日
    00
  • unicode编码解码在线转换工具

    unicode编码解码在线转换工具 Unicode编码是一种国际化编码标准,它为世界范围内的大部分语言字符提供了统一的编码方式。不同于常见的ASCII编码,它包括了许多如汉字、日语假名、阿拉伯字母等字符。 对于需要处理多语言字符的开发者们,通过网页进行Unicode编码与解码已经成为了经常需要操作的事情。这时候我们需要一个可以方便地进行转换的在线工具。本文将…

    其他 2023年3月29日
    00
  • linux轻量级 Web 服务器第1/2页

    Linux轻量级Web服务器攻略 本攻略旨在为初学者提供Linux轻量级Web服务器的基本操作和安装方法。在本攻略中,我们将会涉及以下主题: 轻量级Web服务器的定义和作用 安装和配置Apache 理解Apache的常见配置文件 使用Apache来部署简单的网站 检测Apache的服务状态和日志 1. 轻量级Web服务器的定义和作用 什么是轻量级Web服务器…

    other 2023年6月27日
    00
  • Go字符串操作深入解析

    Go字符串操作深入解析 介绍 Go语言中,字符串是一个常见的数据类型。字符串操作是每个Go程序员都应该掌握的基础操作之一。本文将深入介绍Go语言中的字符串操作,包括字符串的创建、拼接、分割、替换、比较等详细内容。 字符串的创建 Go语言中的字符串是一个只读的字节数组。可以通过以下方式创建一个新的字符串: var str string = "hell…

    other 2023年6月20日
    00
  • (2.7)mysql之sql基础——表的操作与查看

    (2.7)MySQL之SQL基础——表的操作与查看 MySQL是一个常用的关系型数据库管理系统,表是MySQL中的一个核心概念。在MySQL中,我们可以通过SQL语句操作和查看表。本文将介绍MySQL中表的创建、删除、修改以及查看等操作。 创建表 在MySQL中创建表需要使用CREATE TABLE语句。CREATE TABLE语句的基本语法如下: CREA…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部