首页 > 文章列表 > C++ 函数重载和重写中多态性的体现

C++ 函数重载和重写中多态性的体现

函数重载 函数重写
476 2024-04-23

C++ 中的多态性:函数重载允许具有相同名称但不同参数列表的多个函数,根据调用时的参数类型选择执行的函数。函数重写允许派生类重新定义基类中已存在的方法,从而实现不同类型的行为,具体取决于对象的类型。

C++ 函数重载和重写中多态性的体现

C++ 函数重载和重写中多态性的体现

多态性是面向对象编程的关键概念之一。它允许不同类型(派生类)的对象对相同的函数调用做出不同的响应。C++ 通过函数重载(overloading)和重写(overriding)实现了多态性。

函数重载

函数重载是指具有相同名称但不同参数列表的多个函数。编译器将根据实际调用时的参数类型来选择正确的函数。例如,以下代码重载了 area() 函数,它可以计算圆或矩形的面积:

class Circle {
public:
    double area(double radius) {
        return 3.14159 * radius * radius;
    }
};

class Rectangle {
public:
    double area(double length, double width) {
        return length * width;
    }
};

重写

重写是指派生类中重新定义基类中已存在的方法。它允许派生类提供自己的实现,从而实现不同类型的行为。例如,以下代码在派生类 Square 中重写了基类 Rectanglearea() 方法来计算正方形的面积:

class Rectangle {
public:
    virtual double area(double length, double width) {
        return length * width;
    }
};

class Square : public Rectangle {
public:
    virtual double area(double side) override {
        return side * side;
    }
};

实战案例

考虑一个图形库,其中有 Shape 基类和 CircleRectangleSquare 派生类。我们想创建一个函数 draw() 来绘制不同的图形。通过使用重载,我们可以提供不同的 draw() 方法来处理每种形状类型:

struct IShape {
    virtual void draw() = 0;
};

struct Circle : public IShape {
    void draw() override {
        // 代码绘制圆
    }
};

struct Rectangle : public IShape {
    void draw() override {
        // 代码绘制矩形
    }
};

struct Square : public Rectangle {
    void draw() override {
        // 代码绘制正方形
    }
};

在调用 draw() 方法时,C++ 将根据实际对象的类型选择正确的函数版本。这使我们可以编写通用代码来处理不同类型的图形,而无需显式转换或强制转换。