全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++虚函数和纯虚函数的作用_c++多态实现核心原理【详解】

虚函数和纯虚函数是C++实现运行时多态的核心机制:虚函数通过vtable和vptr实现动态绑定,需经指针或引用调用;纯虚函数定义接口、强制子类实现,含纯虚函数的类为抽象类。

虚函数和纯虚函数是 C++ 实现运行时多态的核心机制,它们让程序能在不改变调用代码的前提下,根据对象实际类型自动选择正确的函数版本。

虚函数:实现动态绑定的基础

在基类中用 virtual 声明的成员函数就是虚函数。它告诉编译器:“这个函数可能被派生类重写,调用时别在编译期就定死,留到运行时再决定调用哪个版本。”

关键点:

  • 虚函数必须通过指针或引用调用才触发动态绑定;直接用对象调用仍是静态绑定
  • 派生类中同名、同参数、同返回类型的函数会自动成为虚函数(即使没写 virtual)
  • 构造函数不能是虚函数;析构函数建议声明为 virtual,避免资源泄漏

纯虚函数:强制接口规范的契约工具

纯虚函数形如 virtual void func() = 0;,它没有函数体,只定义接口。含纯虚函数的类叫抽象类,不能实例化,只能被继承。

作用很明确:

  • 明确要求子类必须提供具体实现,否则子类也变成抽象类
  • 把“做什么”和“怎么做”分离,是面向接口编程的典型体现
  • 常用于构建框架层,比如图形系统中定义 draw()resize() 等纯虚函数,由具体形状类去实现

底层原理:虚函数表(vtable)与虚指针(vptr)

C++ 编译器为每个含虚函数的类生成一张虚函数表(vtable),里面存着该类所有虚函数的地址。每个对象内部隐式包含一个虚指针(vptr),指向其所属类的 vtable。

调用过程简化为三步:

  • 通过对象的 vptr 找到对应 vtable
  • 根据虚函数在类中声明的顺序,查 vtable 中对应槽位
  • 跳转到该槽位存储的函数地址执行

这就是为什么虚函数调用比普通函数略慢——多了两次内存寻址,但换来的是灵活的运行时行为。

常见误区与实用建议

容易踩坑的地方:

  • 不要在构造/析构函数中调用虚函数——此时 vptr 指向的是当前正在构造/析构的类的 vtable,不会触发派生类的重写版本
  • 虚函数默认不是 inline 的,即使加了 inline 关键字,编译器通常也会忽略
  • 纯虚函数可以有定义(比如在基类里写 virtual void f() = 0 { /* 默认实现 */ }),但必须通过作用域解析符显式调用
  • 避免过度使用虚函数,无必要不加 virtual;现代 C++ 更倾向用模板+概念(concepts)或 std::variant 实现零开销抽象

基本上就这些。虚函数不是语法糖,而是连接设计意图与运行行为的关键桥梁;理解 vtable 才算真正看懂多态怎么“动”起来。


# 工具  # c++  # 作用域  # 为什么  # 多态  # 成员函数  # 子类  # 构造函数  # 析构函数  # 引用调用  # void  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 对象  # 绑定  # 的是  # 类中  # 重写  # 抽象类  # 或引用  # 派生类  # 也会 


相关文章: 微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  如何快速搭建高效WAP手机网站吸引移动用户?  如何在Tomcat中配置并部署网站项目?  如何用AWS免费套餐快速搭建高效网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  代购小票制作网站有哪些,购物小票的简要说明?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何在IIS服务器上快速部署高效网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  建站之星2.7模板快速切换与批量管理功能操作指南  动图在线制作网站有哪些,滑动动图图集怎么做?  宝塔面板如何快速创建新站点?  如何在云服务器上快速搭建个人网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何高效完成独享虚拟主机建站?  建站主机选虚拟主机还是云服务器更好?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在宝塔面板中创建新站点?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  建站之星如何通过成品分离优化网站效率?  北京网站制作网页,网站升级改版需要多久?  定制建站流程步骤详解:一站式方案设计与开发指南  家庭建站与云服务器建站,如何选择更优?  c# await 一个已经完成的Task会发生什么  c# Task.ConfigureAwait(true) 在什么场景下是必须的  制作网站外包平台,自动化接单网站有哪些?  c++怎么用jemalloc c++替换默认内存分配器【性能】  宿州网站制作公司兴策,安徽省低保查询网站?  Python多线程使用规范_线程安全解析【教程】  如何在阿里云完成域名注册与建站?  手机网站制作与建设方案,手机网站如何建设?  制作公司内部网站有哪些,内网如何建网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何在阿里云服务器自主搭建网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  为什么Go需要go mod文件_Go go mod文件作用说明  阿里云网站制作公司,阿里云快速搭建网站好用吗?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  官网建站费用明细查询_企业建站套餐价格及收费标准指南  安徽网站建设与外贸建站服务专业定制方案  成都响应式网站开发,dw怎么把手机适应页面变成网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。