📜  C++函数覆盖(1)

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

C++函数覆盖

在C++中,函数覆盖是一种面向对象编程的重要概念。当一个派生类定义了一个与基类中同名的函数时,就称为函数覆盖。函数覆盖允许派生类使用自己的实现来替代基类中的实现,从而实现了多态性。

语法
class 基类名 {
public:
    返回类型 函数名(参数列表) {
        // 基类函数实现
    }
};

class 派生类名 : public 基类名 {
public:
    返回类型 函数名(参数列表) {
        // 派生类函数实现
    }
};
  • 基类名:基类的名称。
  • 派生类名:派生类的名称。通过 public 继承基类。
  • 返回类型:函数返回值的数据类型。
  • 函数名:函数的名称。
  • 参数列表:函数的参数及其类型。
功能

函数覆盖实现了多态性,它允许以统一的方式处理不同类型的对象。在程序运行时,派生类的函数会覆盖基类的函数,这样当使用基类指针或引用调用该函数时,会根据实际对象类型调用相应的派生类函数。

示例
#include <iostream>

class Shape {
public:
    virtual void draw() {
        std::cout << "绘制形状" << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "绘制矩形" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "绘制圆形" << std::endl;
    }
};

int main() {
    Shape* shape1 = new Rectangle();
    Shape* shape2 = new Circle();

    shape1->draw(); // 输出:绘制矩形
    shape2->draw(); // 输出:绘制圆形

    delete shape1;
    delete shape2;

    return 0;
}

在上面的示例中,定义了一个基类 Shape 和两个派生类 RectangleCircle。基类中的 draw() 函数被标记为 virtual,表示它是一个虚函数,可以被派生类覆盖。

main() 函数中,通过基类指针调用了派生类的 draw() 函数。基于对象的实际类型,正确的函数被调用,实现了多态行为。

总结

函数覆盖是C++中实现多态性的重要机制。通过使用函数覆盖,派生类可以重写基类中的函数,使得通过基类指针或引用调用函数时能够根据实际对象类型来执行相应的派生类函数。这种灵活性使得代码更容易扩展和维护。