1. 多态的本质与分类
在面向对象编程中,多态可能是最强大但也最容易让人困惑的特性之一。作为C++开发者,我花了整整两年时间才真正理解多态的精髓。记得第一次面试时被问到"什么是多态",我只能结结巴巴地说出"一个接口多种实现",结果被面试官追问细节时完全懵了。现在回想起来,多态其实就像我们日常生活中的"通用指令"——比如你对不同的人说"去工作",学生就会去上课,程序员就会去写代码,厨师就会去做菜。
多态分为两种基本类型:
1.1 编译时多态(静态多态)
这种多态在代码编译阶段就已经确定。最常见的例子就是函数重载和模板。比如我们有一个打印函数:
cpp复制void print(int i) { cout << "整数: " << i << endl; }
void print(double f) { cout << "浮点数: " << f << endl; }
void print(string s) { cout << "字符串: " << s << endl; }
编译器会根据你传入的参数类型,在编译时就决定调用哪个版本的print函数。这种多态的特点是:
- 决定调用哪个函数是在编译时完成的
- 通过参数类型或数量不同来区分
- 执行效率高,因为不需要运行时判断
1.2 运行时多态(动态多态)
这才是我们通常说的"真正的"多态,也是本文要重点讨论的内容。运行时多态允许我们在程序运行时才决定调用哪个函数。典型的例子就是通过基类指针或引用调用虚函数。
想象一个动物园场景:
cpp复制Animal* animals[3];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Lion();
for (int i = 0; i < 3; i++) {
animals[i]->makeSound(); // 这里会根据实际对象类型调用不同的实现
}
运行时多态的特点:
- 函数调用在运行时才解析
- 需要通过虚函数(virtual function)实现
- 提供了更大的灵活性但稍微降低效率
关键理解:多态的核心价值在于"一个接口,多种行为"。它让代码更灵活、更易扩展,是面向对象设计的关键支柱之一。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
