C++ 运行时多态 vs 编译时多态

C++ 运行时多态 vs 编译时多态

核心一句话

编译时多态:编译器在编译阶段就确定调用哪个函数(静态) 运行时多态:程序运行时才确定调用哪个函数(动态)


一、编译时多态(静态多态)

是什么?

编译期间就确定调用哪个函数,不需要等到运行。

实现方式

  1. 函数重载(同一个函数名,不同参数)
  2. 运算符重载
  3. 模板(泛型)

例子:函数重载

cpp

运行

复制代码
class Test {
public:
    void show(int a) {     // 版本1
        cout << "int:" << a;
    }
    void show(string a) {  // 版本2
        cout << "string:" << a;
    }
};

Test t;
t.show(10);     // 编译期就确定调用第1个
t.show("abc");  // 编译期就确定调用第2个

特点

  • 早绑定(early binding)
  • 速度快
  • 无虚函数,无额外开销
  • 编译期就确定调用目标

二、运行时多态(动态多态)

是什么?

运行起来之后,才知道调用子类还是父类的函数。

实现条件

  1. 继承
  2. 父类有虚函数(virtual)
  3. 父类指针 / 引用指向子类对象
  4. 通过指针调用虚函数

例子

cpp

运行

复制代码
class Animal {
public:
    virtual void speak() { // 必须 virtual
        cout << "动物叫" << endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {
        cout << "汪汪汪" << endl;
    }
};

Animal* a = new Dog();
a->speak(); // 运行时才知道调用 Dog::speak()

特点

  • 晚绑定 / 动态绑定(late binding)
  • 依赖 虚函数表
  • 可以灵活扩展,符合开闭原则
  • 有一点点性能开销

三、最核心区别(面试必背)

表格

编译时多态 运行时多态
确定时机 编译时 运行时
实现方式 重载、模板 继承 + 虚函数
绑定方式 早绑定 晚绑定
效率 稍慢
灵活性
是否需要 virtual 不需要 必须需要

四、使用场景(怎么选?)

✔ 编译时多态使用场景

  1. 功能相同,参数不同 → 用重载
  2. 通用逻辑,多种类型都能用 → 用模板
  3. 追求速度、底层、高性能

例子:

  • 工具函数
  • 数据结构(vector、list)
  • 算法函数

✔ 运行时多态使用场景

  1. 父类指针指向不同子类
  2. 需要统一接口、不同实现
  3. 框架、插件、模块化设计
  4. Qt 上位机大量使用!

Qt 真实场景(你项目必用)

cpp

运行

复制代码
QWidget* w = new QPushButton;
w->show(); // 运行时多态

w = new QLabel;
w->show(); // 自动调用对应控件的show

所有 Qt 控件都靠运行时多态实现!


五、最简单总结(背会这 3 句)

  1. 编译时多态 = 重载 + 模板,编译确定,快,不灵活
  2. 运行时多态 = 继承 + 虚函数,运行确定,灵活,稍慢
  3. Qt 上位机、框架、插件化 → 大量使用运行时多态

最强记忆口诀

编译多态看重载, 运行多态看虚函数; 编译快但不灵活, 运行灵活框架用!

相关推荐
这是个栗子31 分钟前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香1 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI1 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second601 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴1 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm1 小时前
linux之线程概念和控制
linux·开发语言·c++
JackieZhengChina2 小时前
零依赖轻量级JS悬浮提示插件title2tip-js的使用教程
开发语言·javascript·ecmascript
hehelm2 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
李永奉3 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug