静态多态在编译期通过模板和重载实现零开销多态,动态多态在运行期通过继承+虚函数+vtable实现灵活行为分发;二者核心区别在于绑定时机与实现机制,常混合使用。
静态多态和动态多态是C++中实现“同一接口、不同行为”的两种根本路径:前者在编译期确定调用哪个函数,后者在运行期根据对象实际类型决定。关键区别不在“有没有多态”,而在于**绑定时机**和**实现机制**。
静态多态不依赖继承或虚函数,核心是让编译器在生成代码前就选好具体函数版本。
print(int) 和 print(double))+、== 等,调用目标同样在编译时确定template void sort(T* arr, int n) ),编译器为每种实际类型(int、string)生成独立函数副本vector 和 vector 是两个完全不同的类型,各自拥有独立的成员函数实例优点是零运行时开销、内联友好、错误在编译期暴露;缺点是代码体积可能增大(模板实例化膨胀),且无法处理运行时才知悉的类型(比如用户输入决定处理哪种数据)。
动态多态解决的是“接口统一、实现可变且未知于编译期”的问题,典型场景是工厂创建对象、容器存多种派生类对象。
例如:Shape* s = new Circle(); s->draw(); —— 编译器不关心 s 指向什么,运行时查 Circle 的 vtable 找到 Circle::draw 并调用。这带来运行时开销(间接跳转、内存访问)、禁止内联,但换来真正的运行时灵活性。
真实项目往往结合两
者。例如:
std::vector),但容器里存的是 std::unique_ptr —— 模板管内存布局,虚函数管行为多态选择依据不是“哪个更高级”,而是看问题本质:类型是否在编译期可知?行为差异是否必须延迟到运行时才能决定?