1.当调用一个对象对应的函数时,通过对象内存中的vptr(虚函数表指针)找到该类的vtbl(虚函数表)
虚函数表位于只读数据段(.rodata),即:C++内存模型中的常量区
虚函数代码则位于代码段(.text),也就是C++内存模型中的代码区
虚函数指针跟随对象实例被创建,在堆区或者栈区(只有使用new运算符,对象才会建立在堆上;将析构函数设为私有,编译器就不会在栈空间上为类对象分配内存)
2.从虚函数表中找到调用的虚函数的指针(地址)
虚函数表vtbl:虚函数指针数组,记录着该类各个虚函数的首地址
参考博客:C++进阶之虚函数表
注意:在多态中基类必须定义虚析构函数,否则会导致在对子类delete时,无法调用子类的析构函数而造成内存泄漏
正常情况下的调用和释放子类对象的过程:父类构造函数-子类构造函数-子类析构函数-父类析构函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具