全网整合营销服务商

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

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

c++中虚函数的实现详解

前言

c++ 分为编译时多态和运行时多态。运行时多态依赖于虚函数,大部分人或许听说过虚函数是由虚函数表+虚函数指针实现的,但,真的是这样吗?虽然 c++ 规范有着复杂的语言细节,但底层实现机制却任由编译器厂商想象。(没准某种特殊的处理器电路结构原生支持虚函数,没准这个处理器压根不是冯纽曼型,或者将来厂商发明了比虚函数表更有效率的数据结构。)

虚函数表

封装把实例的数据和操作结合在了一起,但实例本身只有数据,没有函数,同一个类的函数是共享的。我们通过一个例子来间接证明这一点

class Base1
{
public:
 int a;
 void func() { cout << "heel" << endl; }
};

Base1 b1;
cout << sizeof(b1) << endl;

打印

4

如果类中有虚函数,则会在对象中加入一个虚函数指针,该指针指向一个虚函数表,表中是各个虚函数的地址。

+--------+    +---------+
| pvtbl |------>| vfunc1 |
+--------+    +---------+
| data1 |    | vfunc2 |
+--------+    +---------+
| ...  |    | ...   |

当子类继承父类时,会依次覆盖虚函数表中的各个项,如果子类没有重写某项,那该项就保留。当实例化对象后,虚函数指针就作为一个隐藏数据存在于实例中。如果通过父类指针调用普通成员函数,由于普通函数和类型绑定在一起,所以仍会调用父类成员函数;如果通过父类指针调用虚函数,则会通过对象的虚指针找到虚函数表(即子类的虚函数表),定位虚函数项,实现多态。

原理是不是很简单?c++ 就是通过这种看似原始的方式实现高级抽象。以上是编译器的通用做法,我手上的 Visual Studio 2013 编译器就是这么做的,为了提高性能,VS 保证虚函数指针存在于对象实例中最前面位置(历史上也有编译器不这么做,好像是 Borland 的?)。

Visual Studio 2013 中的实现

来一个例子(能这么写是因为我已知了 Visual Studio 2013 编译后对象的内存布局)

#include <iostream>
using namespace std;

class Base 
{
public:
 typedef void (*func)();
 virtual void func1() { cout << "Base::func1" << endl; }
 virtual void func2() { cout << "Base::func2" << endl; }
 virtual void func3() { cout << "Base::func3" << endl; }
};

class Derived: public Base
{
public:
 virtual void func1() { cout << "Derived::func1" << endl; }
 virtual void func3() { cout << "Derived::func3" << endl; }
};

int main()
{
 Base b, b1;
 int** pvirtualtable1 = (int**)&b;
 cout << "Base object vtbl address: " << pvirtualtable1[0] << endl;
 int** pvirtualtable11 = (int**)&b1;
 cout << "another Base object vtbl address: " << pvirtualtable11[0] << endl;
 cout << "function in virtual table" << endl;
 for (int i = 0; (Base::func)pvirtualtable1[0][i] != NULL; ++i)
 {
 auto p = (Base::func)pvirtualtable1[0][i];
 p();
 }
 cout << endl;

 Derived d;
 int** pvirtualtable2 = (int**)&d;
 cout << "Derived object vtbl address: " << pvirtualtable2[0] << endl;
 cout << "function in virtual table" << endl;
 for (int i = 0; (Base::func)pvirtualtable2[0][i] != NULL; ++i)
 {
 auto p = (Base::func)pvirtualtable2[0][i];
 p();
 }
 cout << endl;
}

打印

Base object pvtbl address: 0029DA58
another Base object pvtbl address: 0029DA58
function address in virtual table
Base::func1
Base::func2
Base::func3

Derived object pvtbl address: 0029DB20
function address in virtual table
Derived::func1
Base::func2
Derived::func3

可以看到,同一类型不同实例的虚函数表是相同的,继承之后,子类有了自己的虚函数表,表也有相应的更新(Derived::func1, Derived::func3),表中未重写的项还保留为原值(Base::func2)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# c  # 虚函数实现  # c虚函数实现机制  # c虚函数的实现机制  # 详解C++纯虚函数与抽象类  # C++ 中virtual 虚函数用法深入了解  # 详细分析C++ 多态和虚函数  # 详解C++虚函数的工作原理  # C++ 虚函数专题  # C++ 基础教程之虚函数实例代码详解  # 浅谈C++ 虚函数分析  # C++ 虚函数的详解及简单实例  # C++ 中const修饰虚函数实例详解  # 浅谈C++ 虚函数  # 子类  # 也有  # 多态  # 重写  # 这么做  # 则会  # 自己的  # 的是  # 是因为  # 是由  # 数据结构  # 更有  # 很简单  # 可以看到  # 作为一个  # 在对  # 我已  # 这篇文章  # 听说过  # 该项 


相关文章: 如何在IIS中新建站点并配置端口与物理路径?  制作网站的软件免费下载,免费制作app哪个平台好?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  建站之星24小时客服电话如何获取?  如何安全更换建站之星模板并保留数据?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何选择建站程序?包含哪些必备功能与类型?  c# 服务器GC和工作站GC的区别和设置  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  测试制作网站有哪些,测试性取向的权威测试或者网站?  平台云上自主建站:模板化设计与智能工具打造高效网站  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站之星收费标准详解:套餐费用及年费价格表一览  如何在万网自助建站中设置域名及备案?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  Android滚轮选择时间控件使用详解  如何有效防御Web建站篡改攻击?  开源网站制作软件,开源网站什么意思?  青岛网站建设如何选择本地服务器?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何通过cPanel快速搭建网站?  如何快速搭建高效WAP手机网站?  广州营销型建站服务商推荐:技术优势与SEO优化解析  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作价目表怎么做,珍爱网婚介费用多少?  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站之星如何快速生成多端适配网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  建站之星导航配置指南:自助建站与SEO优化全解析  c# 在高并发场景下,委托和接口调用的性能对比  如何用PHP快速搭建CMS系统?  ,网站推广常用方法?  建站VPS能否同时实现高效与安全翻墙?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  高性价比服务器租赁——企业级配置与24小时运维服务  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  网站按钮制作软件,如何实现网页中按钮的自动点击?  宁波自助建站系统如何快速打造专业企业网站?  ,南京靠谱的征婚网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站主机CVM配置优化、SEO策略与性能提升指南  建站VPS推荐:2025年高性能服务器配置指南 

您的项目需求

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