📜  C++中的多态(1)

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

C++中的多态

多态是面向对象编程中一个重要的概念,它允许使用基类的指针或引用来调用派生类的函数,从而实现不同对象的统一接口。

多态的基本概念

在 C++ 中,通过使用虚函数和继承,我们可以实现多态。多态包括静态多态和动态多态。

  • 静态多态:通过函数重载和运算符重载来实现,在编译时确定函数的调用。
  • 动态多态:通过虚函数来实现,在运行时确定函数的调用。
虚函数和纯虚函数

在基类中,通过将成员函数声明为虚函数来实现多态。虚函数可以在派生类中用相同的函数名进行重写,并用 virtual 关键字进行标识。派生类对象在通过基类指针或引用调用虚函数时,将根据对象的实际类型来调用相应的派生类函数。

以下是一个使用虚函数的示例:

class Shape {
public:
    virtual void draw() {
        // 在基类中实现默认的绘制行为
    }
};

class Circle : public Shape {
public:
    void draw() override {
        // 在派生类中实现绘制圆形的具体行为
    }
};

class Square : public Shape {
public:
    void draw() override {
        // 在派生类中实现绘制正方形的具体行为
    }
};

int main() {
    Circle c;
    Square s;
    Shape* shape1 = &c;
    Shape* shape2 = &s;
    shape1->draw(); // 调用Circle类的draw函数
    shape2->draw(); // 调用Square类的draw函数
    return 0;
}

在上面的例子中,Shape 是一个基类,CircleSquare 是派生类。通过将 Shape 类的 draw 函数声明为虚函数,我们可以在派生类中进行函数重写,并通过基类指针调用相应的派生类函数。

有时候基类中的虚函数没有具体的实现,这时我们可以将它声明为纯虚函数,通过 = 0 来标识。纯虚函数必须在派生类中进行实现。

虚析构函数

当基类指针指向派生类对象,并通过该指针删除派生类对象时,如果基类的析构函数不是虚函数,就会导致只调用基类的析构函数而不会调用派生类的析构函数。为了避免这种情况,我们通常将基类的析构函数声明为虚函数,以确保在删除派生类对象时会正确地调用派生类的析构函数。

class Shape {
public:
    virtual ~Shape() {
        // 析构函数可能需要执行一些清理工作
    }

    virtual void draw() {
        // ...
    }
};

在上面的例子中,我们将 Shape 类的析构函数声明为虚函数,以便在通过基类指针删除派生类对象时,能够正确地调用派生类的析构函数。

虚函数表

在使用虚函数时,C++ 使用一个虚函数表(vtable)来存储类的虚函数的地址。每个具有虚函数的类都有一个对应的虚函数表。当通过基类指针调用虚函数时,实际上是通过虚函数表来查找并调用正确的函数。

总结

多态是面向对象编程中一个非常重要的概念,通过使用虚函数和继承,我们可以在 C++ 中实现多态。多态能够提高代码的可重用性和可扩展性,使程序更灵活和易于维护。

以上是关于 C++ 中多态的介绍。希望对你有所帮助!