C++ 多态 虚函数virtual

发布时间 2023-06-04 21:11:29作者: Toriyung

先解释虚函数,对于基类,子类继承基类后可能会调用其某个函数FA,而不同的子类继承了同一个基类后需要基类内某个同样的函数FA但又不是同个作用,此时则会在对应的子类内对应重载派生出FA_B函数和FA_C函数,而这时要求FA为虚函数(virtual)

那为什么不各自写成一个函数B和C呢?这就是多态的意义

对于基类A和子类B,C有

B b;
C c;

A *ab = &b;
A *ac = &c;

则基类指针指向子类,此时调用其内函数

ab->FA;
ac->FA;

虽然是同一个类的同一个函数,但是其效果不一致,这就是多态,即规范了写法又实现灵活的功能

 

用法:

  基类内虚函数前缀virtual,纯虚函数则以const=0结尾,必须重载功能才有具体意义;而非纯虚函数则是先定义好功能,子类可选择性进行重载。

 

完整代码参考

#include <iostream>

// 形状的基类
class Shape {
public:
    virtual double calculateArea() const = 0;
};

// 矩形类
class Rectangle : public Shape {
private:
    double length;
    double width;
public:
    Rectangle(double l, double w) : length(l), width(w) {}
    double calculateArea() const override {
        return length * width;
    }
};

// 圆类
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    double calculateArea() const override {
        return 3.14 * radius * radius;
    }
};

int main() {
    Rectangle rectangle(5, 4);
    Circle circle(3);

    Shape* shape1 = &rectangle;
    Shape* shape2 = &circle;

    // 通过基类指针调用不同对象的函数
    std::cout << "Area of rectangle: " << shape1->calculateArea() << std::endl;
    std::cout << "Area of circle: " << shape2->calculateArea() << std::endl;

    return 0;
}