第三节 · 进化论 · 虚函数与抽象基类

多态是面向对象的精髓:同一个接口,不同的实现。通过多态,我们可以用统一的方式处理不同类型的对象。


虚函数

class Shape
{
public:
    // 虚函数:允许派生类重写
    virtual void draw() const
    {
        cout << "Drawing a shape" << endl;
    }
};

class Circle : public Shape
{
public:
    void draw() const override  // override 确保是重写
    {
        cout << "Drawing a circle" << endl;
    }
};

class Rectangle : public Shape
{
public:
    void draw() const override
    {
        cout << "Drawing a rectangle" << endl;
    }
};

int main()
{
    Shape* shapes[3];
    shapes[0] = new Shape();
    shapes[1] = new Circle();
    shapes[2] = new Rectangle();
    
    for (int i = 0; i < 3; ++i)
    {
        shapes[i]->draw();  // 根据实际类型调用
    }
    
    // 清理
    for (int i = 0; i < 3; ++i)
        delete shapes[i];
    
    return 0;
}
// 输出:
// Drawing a shape
// Drawing a circle
// Drawing a rectangle

override 和 final


纯虚函数与抽象类


虚析构函数

规则:如果类有虚函数,就应该有虚析构函数。


动态绑定原理


RTTI:运行时类型识别


接口模式


NVI 模式(非虚接口)


习题

  • 解释虚函数表(vtable)的工作原理。

  • 什么时候需要虚析构函数?

  • 实现一个简单的图形编辑器,使用多态处理不同形状。

Last updated