0

0

C++怎么使用虚函数_C++多态机制教程【面向】

冰火之心

冰火之心

发布时间:2026-02-26 01:25:25

|

750人浏览过

|

来源于php中文网

原创

虚函数必须在基类中用virtual显式声明,否则不触发多态;多态仅通过指针或引用实现,对象传值或赋值会导致切片;子类重写须加override防误定义,析构函数需virtual防内存泄漏。

c++怎么使用虚函数_c++多态机制教程【面向】

虚函数必须在基类中用 virtual 显式声明

不加 virtual,哪怕子类写了同名函数,调用时也不会走多态——编译器只看指针/引用的静态类型。这是最常踩的坑:以为“名字一样就自动多态”,结果 Base* p = new Derived(); p->func(); 调的还是 Base::func()

实操建议:

  • virtual 只需写在基类声明里,子类重写时加不加都行(C++11 起推荐加 override
  • 纯虚函数写成 virtual void func() = 0;,含纯虚函数的类就是抽象类,不能实例化
  • 析构函数如果可能通过基类指针删除派生对象,必须声明为 virtual,否则派生部分内存泄漏

运行时多态只对指针和引用生效

直接用对象变量调用,比如 Base b = derived_obj;(发生切片),再调 b.func(),永远绑定到 Base::func()。多态不是靠函数名,而是靠“间接访问”机制——只有通过指针或引用,才能触发虚函数表查找。

常见错误现象:

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

citySHOP多用户商城系统
citySHOP多用户商城系统

citySHOP是一款集CMS、网店、商品、分类信息、论坛等为一体的城市多用户商城系统,已完美整合目前流行的Discuz! 6.0论坛,采用最新的5.0版PHP+MYSQL技术。面向对象的数据库连接机制,缓存及80%静态化处理,使它能最大程度减轻服务器负担,为您节约建设成本。多级店铺区分及联盟商户地图标注,实体店与虚拟完美结合。个性化的店铺系统,会员后台一体化管理。后台登陆初始网站密匙:LOVES

下载
  • 把派生类对象赋值给基类对象(非指针/引用),以为能多态,实际发生对象切片,派生成员全丢
  • 函数参数传值(void f(Base b)),进来就切片,内部调 b.func() 不会多态
  • 正确做法是传 Base&Base*

overridefinal 是 C++11 后必备的安全补丁

没加 override 时,子类函数签名稍有偏差(比如参数 const 性不同、返回类型协变没满足),就会变成新函数而非重写,虚函数表里根本没它——运行时静默调错函数,极难排查。

实操建议:

  • 只要意图重写虚函数,就在子类声明后无条件加 override,编译器立刻报错提示签名不匹配
  • 确定某个虚函数不再被进一步重写,就在基类或中间类里用 final(如 virtual void f() final;),防止意外继承破坏契约
  • overridefinal 都是标识符,不是关键字,但只在虚函数重写上下文有效

虚函数调用有轻微开销,但别过早优化

每次调用要查虚函数表(vtable),多一次间接寻址,比普通函数调用慢一点。但在绝大多数业务逻辑里,这点开销远小于 IO、内存分配或算法复杂度本身。

需要注意的点:

  • 高频内层循环里反复调用虚函数(比如每帧上万次的图形渲染钩子),才值得考虑用模板或策略模式规避
  • 开启编译器优化(-O2)后,部分虚调用可能被 devirtualize(如编译期能确定唯一类型)
  • 真正影响性能的往往是虚函数背后做的事(比如锁、拷贝、动态分配),而不是虚调用本身

虚函数表布局、RTTI、多重继承下的虚函数行为,这些细节一旦涉及,问题会立刻从“语法是否写对”滑向“内存模型是否理解”。初学阶段盯住 virtualoverride、指针/引用这三点,已经能覆盖 95% 的多态使用场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

27

2025.11.27

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

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

27

2025.11.27

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2024.02.23

java标识符合集
java标识符合集

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

287

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

167

2025.08.07

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

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

552

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

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

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