📜  C++ |虚函数|问题14(1)

📅  最后修改于: 2023-12-03 14:39:54.227000             🧑  作者: Mango

C++ | 虚函数 | 问题14

在C++中,虚函数是一种非常有用的概念。它使得我们能够在派生类中重写基类的函数,从而可以实现多态性。本文将介绍虚函数的相关概念,并提供一个程序示例。

虚函数是什么?

虚函数是一个在基类中声明的函数,带有关键字 virtual。它可以在派生类中重写,在运行时根据对象的实际类型来调用不同的函数。

例如,我们有一个基类 Shape 和两个派生类 RectangleTriangleShape 中声明了虚函数 getArea()。在派生类中,我们可以对此函数进行重写,例如:

class Shape {
public:
    virtual double getArea() {
        return 0;
    }
};

class Rectangle : public Shape {
public:
    double getArea() override {
        return length * width;
    }
private:
    double length;
    double width;
};

class Triangle : public Shape {
public:
    double getArea() override {
        return 0.5 * base * height;
    }
private:
    double base;
    double height;
};

这里,Shape 中声明的 getArea() 函数是虚函数,它被派生类 RectangleTriangle 分别重写了。

虚函数的工作原理

当我们调用一个虚函数时,编译器并不知道要调用的确切函数。相反,它将控制权交给程序在运行时决定要调用哪个函数。例如,考虑下面的代码片段:

Shape* shape_ptr;
Rectangle rect;
shape_ptr = ▭
double area = shape_ptr->getArea();

这里,我们首先定义了一个基类指针 shape_ptr,然后将一个派生类 Rectangle 的实例的地址赋给它。接下来,我们调用虚函数 getArea(),由于 shape_ptr 指向的实际对象是 Rectangle,所以调用 Rectangle 中的 getArea() 函数。

虚函数的关键字

虚函数的关键字是 virtual。当我们在基类中声明函数时使用 virtual 关键字时,它告诉编译器我们希望将该函数标记为虚函数。例如:

class Shape {
public:
    virtual double getArea() {
        return 0;
    }
};

派生类中的虚函数不需要使用 virtual 关键字,但是建议使用 override 关键字标注,以便更清楚地表明我们正在重写基类中的虚函数。例如:

class Rectangle : public Shape {
public:
    double getArea() override {
        return length * width;
    }
private:
    double length;
    double width;
};
程序示例

下面是一个示例程序,它演示一个基类和两个派生类,基类中包含虚函数。

#include <iostream>

using namespace std;

class Shape {
public:
    virtual double getArea() {
        return 0;
    }
};

class Rectangle : public Shape {
public:
    Rectangle(double length, double width) : length(length), width(width) {};
    double getArea() override {
        return length * width;
    }
private:
    double length;
    double width;
};

class Triangle : public Shape {
public:
    Triangle(double base, double height) : base(base), height(height) {};
    double getArea() override {
        return 0.5 * base * height;
    }
private:
    double base;
    double height;
};

int main() {
    Shape* shape_ptr;
    Rectangle rect(5, 10);
    Triangle tri(5, 10);

    shape_ptr = &rect;
    cout << "Rectangle Area: " << shape_ptr->getArea() << endl;

    shape_ptr = &tri;
    cout << "Triangle Area: " << shape_ptr->getArea() << endl;

    return 0;
}

运行结果如下:

Rectangle Area: 50
Triangle Area: 25
结论

虚函数是C++中非常强大和灵活的概念,它可以帮助我们实现多态性并方便地重用代码。本文提供了一个虚函数的简要介绍,并提供了一个示例程序,它演示了虚函数的基本用法。