从汇编角度看虚函数和普通成员函数的调用过程

本文探讨了C++中普通成员函数与虚成员函数的调用过程。对于normal成员函数,调用绑定到具体对象,地址对应函数在内存中的位置。而virtual成员函数的地址指示vtable中的位置,通过vtable调用。文章通过实例代码分析了两者在内存分布和调用方式上的差异,特别指出构造函数不能为虚函数的原因。
摘要由CSDN通过智能技术生成

本篇文章直入正题。

我们的类成员函数分为inline、virtual、static、normal。

**normal成员函数:**其地址和一般函数的地址没有区别,就是函数代码在内存中的真实地址,但其调用要绑定到一个实实在在的对象上。取其地址需要使用“&”运算符。
**virtual成员函数:**其地址指的是其在vtable中的位置;取其地址需要使用“&”运算符。
inline成员函数:在运行时会展开,虽然语言允许取其地址,但是没有太大意义。
static成员函数:其地址和普通全局函数的地址没有任何区别;其不依赖与类的对象而存在,也不依赖与类的对象而调用,只是作用域变成了类作用域,可以像取全局函数的地址那样直接把类静态成员函数名指派给一个普通全局函数类型的指针,并可以直接用这个指针实现对该静态成员函数的调用。

我们本文暂时只讨论普通成员函数和虚成员函数在调用过程中的区别。

讲解用例代码文章末。

调用默认的构造函数

首先因为含有虚函数的类,如果没有构造函数的话,也会调用默认的构造函数。
因为构造函数需要用来初始化虚表指针。(这也是构造函数为什么不可以作为虚函数的原因)。
在这里插入图片描述
在这里插入图片描述
虚表地址

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值