0

0

C++如何实现多态_C++虚函数表与动态绑定原理图解

穿越時空

穿越時空

发布时间:2025-12-04 10:22:46

|

560人浏览过

|

来源于php中文网

原创

多态通过虚函数表和虚函数指针实现:1. 基类指针指向派生类对象并调用虚函数时,通过vptr找到对应vtable;2. 在vtable中查找函数地址并调用,实现运行时绑定。

c++如何实现多态_c++虚函数表与动态绑定原理图解

在C++中,多态是通过虚函数动态绑定实现的,其核心机制依赖于虚函数表(vtable)虚函数指针(vptr)。下面用图解方式说明其工作原理。

1. 多态的基本条件

要实现多态,必须满足以下三个条件:

  • 使用基类的指针或引用指向派生类对象
  • 基类中声明的函数为虚函数(virtual)
  • 派生类重写(override)该虚函数

示例代码:

class Animal {
public:
    virtual void speak() {
        cout << "Animal speaks" << endl;
    }
};

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

int main() { Animal* ptr = new Dog(); ptr->speak(); // 输出: Dog barks }

虽然指针类型是 Animal*,但调用的是 Dog 的 speak() 函数——这就是运行时多态

立即学习C++免费学习笔记(深入)”;

2. 虚函数表(vtable)与虚函数指针(vptr)

C++编译器为每个含有虚函数的类生成一张虚函数表(vtable),表中存放的是该类所有虚函数的地址。

每个对象内部会自动添加一个隐藏的指针——vptr,它指向所属类的 vtable。

内存布局示意图:

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

下载
Animal 类:
+------------------+
|     vptr --------|-----> [vtable_Animal]
|                  |       +-----------------+
+------------------+       | &Animal::speak  |
                           +-----------------+

Dog 类: +------------------+ | vptr --------|-----> [vtable_Dog] | | +---------------+ +------------------+ | &Dog::speak | +---------------+

当 Dog 重写 speak() 时,它的 vtable 中对应项就指向自己的实现。

3. 动态绑定过程(运行时调用解析)

当通过基类指针调用虚函数时,实际执行过程如下:

  • 通过对象的 vptr 找到其类的 vtable
  • 在 vtable 中查找对应虚函数的地址
  • 跳转到该地址执行函数

这个过程发生在运行时,因此称为动态绑定

调用流程图解:

ptr->speak();
  1. ptr 指向 Dog 对象
  2. 从 Dog 对象取出 vptr
  3. vptr 指向 vtable_Dog
  4. 查找 vtable_Dog 中 speak() 的地址
  5. 调用 Dog::speak()

4. 注意事项与常见误区

理解虚函数机制时需注意:

  • 普通成员函数是静态绑定,编译期就确定调用哪个函数
  • 只有虚函数才走 vtable 机制,非虚函数不参与多态
  • 构造函数不能是虚函数(对象未完成构造时 vptr 未初始化)
  • 析构函数通常应声明为虚函数,防止资源泄漏
  • 虚函数有轻微性能开销:一次指针跳转 + 表查找

基本上就这些。虚函数表机制是C++实现面向对象多态的核心,理解它有助于写出更高效、安全的继承代码。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

50

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

14

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号