C++中多态分为编译时和运行时两种:编译时多态通过函数重载和模板在编译期确定调用版本,效率高但可能导致代码膨胀;运行时多态通过虚函数和继承在运行期动态绑定,灵活性强但有性能开销。

在C++中,多态性是指同一个接口可以表现出不同的行为。根据多态发生的时间不同,C++中的多态分为编译时多态和运行时多态。这两种多态机制在实现方式、性能和使用场景上各有特点。
编译时多态(静态多态)
编译时多态是指在程序编译阶段就确定了函数调用的具体实现,不需要等到程序运行时才决定。这种多态主要通过函数重载和模板(泛型编程)来实现。
1. 函数重载
同一作用域内可以有多个同名函数,但参数列表必须不同(参数个数、类型或顺序不同)。编译器根据调用时传入的实参类型选择匹配的函数版本。
示例:
立即学习“C++免费学习笔记(深入)”;
void print(int x) { cout << "整数: " << x << endl;}void print(double x) {cout << "浮点数: " << x << endl;}
print(5); // 调用 print(int)print(3.14); // 调用 print(double)
2. 模板(函数模板与类模板)
模板允许编写与类型无关的通用代码。编译器会为每种实际使用的类型生成对应的函数或类实例。
示例:
立即学习“C++免费学习笔记(深入)”;
templateT max(T a, T b) { return a > b ? a : b;}max(3, 5); // 编译器生成 int 版本max(2.7, 3.9); // 编译器生成 double 版本
编译时多态的优点是效率高,因为没有虚函数表查找开销;缺点是代码膨胀,每个模板实例都会生成一份独立代码。
运行时多态(动态多态)
运行时多态是指函数调用的绑定发生在程序运行期间,通常通过继承和虚函数(virtual function)机制实现。它允许基类指针或引用指向派生类对象,并调用被重写的成员函数。
实现方式:虚函数 + 继承
基类中声明某个函数为 virtual。派生类中重写(override)该函数。使用基类指针或引用调用该函数时,实际执行的是派生类的版本。
示例:
立即学习“C++免费学习笔记(深入)”;
class Shape {public: virtual void draw() { cout << "绘制图形" << endl; }};class Circle : public Shape {public:void draw() override {cout << "绘制圆形" << endl;}};
class Rectangle : public Shape {public:void draw() override {cout << "绘制矩形" << endl;}};
Shape s1 = new Circle();Shape s2 = new Rectangle();s1->draw(); // 输出:绘制圆形s2->draw(); // 输出:绘制矩形
运行时多态依赖虚函数表(vtable)机制,每个含有虚函数的类都有一个虚表,对象包含指向该表的指针(vptr)。调用虚函数时,通过查表找到实际应调用的函数地址。
优点是灵活性高,支持接口统一和扩展;缺点是存在轻微性能开销(间接跳转),且仅适用于指针和引用。
两种多态对比总结
发生时机:编译时多态在编译期确定调用函数,运行时多态在运行期确定。实现机制:前者靠函数重载和模板,后者靠虚函数和继承。性能:编译时多态更快,无额外开销;运行时多态有虚函数调用开销。适用场景:模板适合通用算法(如STL),虚函数适合面向对象设计中的接口抽象。
基本上就这些。理解这两类多态有助于写出更高效、更灵活的C++代码。
以上就是c++++中什么是编译时多态和运行时多态_c++多态性分类与实现方式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485946.html
微信扫一扫
支付宝扫一扫