C++ 重写成员函数

C++ 重写成员函数

在面向对象编程中,继承是最强大的概念之一。它使一个类能够继承另一个类的特性和行为。重写是C++编程中用于修改派生类中继承的成员函数行为的技术。本文将详细介绍在C++中重写成员函数的概念。

什么是重写成员函数

在C++中,当派生类从基类继承一个成员函数时,它可以在派生类中重新定义该函数的行为。这个重新定义基类成员函数的过程称为

“重写”,被重新定义的函数称为”重写成员函数”。

换句话说,当派生类定义了一个与基类中的成员函数同名且具有相同签名的成员函数时,派生类的函数将覆盖基类的函数。

如何在C++中重写成员函数

要在C++中重写成员函数,我们需要按照以下步骤进行:

步骤1:定义一个带有虚函数的基类:

虚函数是在基类中使用”virtual”关键字声明的一种成员函数类型。这表明该函数可以在派生类中重写。声明虚函数的语法如下:

C++代码:

class Base {
public:
    virtual void myFunction() {
        // Base class implementation
    }
};

步骤2:定义一个覆盖虚函数的派生类:

要覆盖一个虚函数,我们需要定义一个继承自基类的派生类,并提供一个新的实现来覆盖虚函数。定义覆盖虚函数的派生类的语法如下:

C++代码:

class Derived : public Base {
public:
    void myFunction() override {
        // Derived class implementation
    }
};

步骤3:创建派生类的对象并调用虚函数:

我们可以创建派生类的对象并使用指向基类的指针调用 虚函数 。创建派生类的对象并调用 虚函数 的语法如下:

C++代码:

Base* basePtr = new Derived();
basePtr->myFunction();

当我们使用基类的指针调用 虚函数 时,会调用派生类中 虚函数 的实现。

示例:

让我们来看一个示例,演示C++中覆盖成员函数的概念。在上面的示例中,我们有一个叫做Base的基类或父类,其中有一个虚函数。我们还有两个派生类,分别叫做Circle和Square,它们覆盖了draw()函数以提供自己的实现。

C++代码:

#include 
class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape" << std::endl;
    }
};

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

class Square : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a square" << std::endl;
    }
};

int main() {
    Shape* shapePtr = new Circle();
    shapePtr->draw();

    shapePtr = new Square();
    shapePtr->draw();

    return 0;
}

输出:

Drawing a circle
Drawing a square

在这个示例中,我们创建了 CircleSquare 类的对象,并使用指向基类 Shape 的指针调用 draw ()函数。由于 draw ()函数是虚函数,因此会调用派生类中的实现,我们得到的输出为“Drawing a circle”和“Drawing a square”。

重写成员函数的优点

多态性:

重写的一个主要优点是它使得多态性成为可能。多态性允许一个派生类根据使用的上下文具有多个行为。

代码可重用性:

重写允许从基类中重用代码,同时允许派生类修改基类成员函数的行为。

模块化:

重写使得更容易维护代码,因为对派生类的更改不会影响基类。

重写成员函数的规则

  • 派生类中的重写函数必须与基类函数具有相同的名称和参数。
  • 重写函数必须具有与基类函数相同的返回类型或协变返回类型。
  • 派生类中重写函数的访问级别不能比基类函数更严格。
  • 在基类函数的声明中必须使用 虚拟 关键字。
  • 基类中的函数必须以与派生类相同的访问级别或更高级别声明。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程