讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】

老芳姑娘_3956

老芳姑娘_3956

发布时间:2026-01-01 18:12:08

|

926人浏览过

|

来源于php中文网

原创

只有通过基类指针或引用调用virtual函数才触发动态绑定;直接用对象名调用为静态绑定;virtual须显式写在基类声明前;函数签名须严格匹配;构造函数不能为虚,析构函数应为virtual;每个含虚函数的类有vtable,对象含vptr指向vtable。

c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】

虚函数怎么写才触发动态绑定

只有通过基类指针或引用调用 virtual 函数时,C++ 才会启用运行时多态。直接用对象名调用(如 obj.func())永远走静态绑定,编译器在编译期就确定调用哪个函数。

  • virtual 必须显式写在基类函数声明前,派生类重写时可加可不加(但建议加上,提高可读性)
  • 函数签名(包括参数类型、const 修饰、返回类型协变)必须严格匹配,否则是重载而非重写
  • 构造函数不能是虚函数;析构函数应声明为 virtual,否则 delete 基类指针时不会调用派生类析构函数

虚函数表(vtable)长什么样

每个含虚函数的类在编译后都有一个隐式的静态数组(即 vtable),里面存的是该类所有虚函数的函数指针。每个该类的对象开头都隐含一个指针(vptr),指向其所属类的 vtable。

例如:

class Base {
public:
    virtual void f() { cout << "Base::f"; }
    virtual void g() { cout << "Base::g"; }
};
class Derived : public Base {
public:
    void f() override { cout << "Derived::f"; } // 覆盖 Base::f
    void h() { cout << "Derived::h"; } // 非虚函数,不进 vtable
};

此时:Base 对象的 vptr 指向含 &Base::f 和 &Base::g 的表;Derived 对象的 vptr 指向另一张表,其中第一项是 &Derived::f(覆盖后的),第二项是 &Base::g(未被重写,沿用基类实现)。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

为什么父类指针能调用子类函数

关键在“间接跳转”:当执行 base_ptr->f() 时,编译器生成的指令是——先通过 base_ptr 找到对象首地址,再读取首地址处的 vptr,再根据函数在虚函数表中的索引(比如第 0 项)查出实际函数地址,最后跳过去执行。

  • 这个过程发生在运行时,所以叫“动态绑定”
  • 如果基类没声明 virtual,编译器根本不会生成 vtable,也不会插入 vptr,自然无法动态分发
  • 多重继承下 vtable 更复杂(可能多个 vptr),但单继承场景下结构清晰、开销极小(一次指针解引用 + 一次查表)

容易被忽略的坑:override 和 final 的实际作用

override 不是语法糖,它让编译器检查你是否真的重写了虚函数——若基类没有对应虚函数,或签名不匹配,会直接报错(如 error: 'f' does not override any member functions)。不用 override 可能静默变成重载,导致多态失效。

final 则阻止后续派生类重写该虚函数,也禁止该类被继承(加在类名后)。它影响的是编译期检查,不影响 vtable 布局本身,但能帮助编译器做优化(比如内联判断)。

示例:

struct A {
    virtual void foo() {}
};
struct B : A {
    void foo() override final {} // OK
};
struct C : B {
    void foo() override {} // 错误:B::foo 是 final
};

虚函数机制本身简单,但真正难的是在大型继承体系中保持 vtable 一致性、避免意外切片、以及理解 static_cast / dynamic_cast 对 vptr 的依赖。这些细节一旦出错,往往表现为调用到错误函数或崩溃,且调试时看不到 vtable 的原始布局。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

375

2025.11.27

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

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

375

2025.11.27

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

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

375

2025.11.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1069

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3420

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2418

2023.09.20

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

2112

2025.09.03

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn