多态是C++面向对象编程中的重要特性之一,它允许同一个接口调用不同的具体实现,从而实现灵活和可扩展的代码设计。下面是C++中多态的详细讲解和经典示例。


C++ 多态详解

一、多态概念

多态(Polymorphism)指同一个操作作用于不同的对象,可以产生不同的行为。主要有两种多态:

  • 编译时多态(静态多态):函数重载、运算符重载、模板等。
  • 运行时多态(动态多态):通过基类指针或引用调用派生类重写的虚函数。

这里重点讲解运行时多态。


二、实现运行时多态的关键:虚函数(virtual

  • 基类中将函数声明为 virtual
  • 派生类重写该虚函数。
  • 使用基类指针或引用指向派生类对象,调用该函数时,执行的是派生类的版本。

三、示例代码

#include <iostream>
using namespace std;

// 基类
class Animal {
public:
    virtual void speak() {  // 虚函数
        cout << "Animal speaks" << endl;
    }

    virtual ~Animal() {}  // 虚析构,确保派生类对象正确析构
};

// 派生类1
class Dog : public Animal {
public:
    void speak() override {  // 重写虚函数
        cout << "Dog barks" << endl;
    }
};

// 派生类2
class Cat : public Animal {
public:
    void speak() override {
        cout << "Cat meows" << endl;
    }
};

void makeAnimalSpeak(Animal* animal) {
    animal->speak();
}

int main() {
    Animal* a1 = new Dog();
    Animal* a2 = new Cat();

    makeAnimalSpeak(a1);  // 输出:Dog barks
    makeAnimalSpeak(a2);  // 输出:Cat meows

    delete a1;
    delete a2;
    return 0;
}

四、多态注意点

  1. 基类析构函数应声明为虚函数,否则删除派生类对象时可能导致资源未释放。
  2. 虚函数调用有一定开销(通过虚函数表实现)。
  3. 多态发生在通过基类指针或引用调用虚函数时。

五、总结

  • 多态通过虚函数实现,允许接口统一、实现多样。
  • 是实现面向对象设计原则如“开闭原则”的重要机制。
  • 在设计抽象基类、接口类时必须用虚函数。

如果你需要,我还能帮你写:

  • 纯虚函数和抽象类示例
  • 多态与智能指针结合的示例
  • C++模板与多态的区别对比

随时告诉我!