C++虚指针和虚函数表
C++虚指针和虚函数表
C++实现多态的方式是通过虚指针和虚函数表
具体来说,当访问一个虚函数时,通过访问vptr,再加上一个偏移获取函数的指针。
子类的vtable相当于父类vtable的拷贝,然后替换掉表中被重写的虚函数的地址为子类的该函数地址。

代码
#include<iostream>
#include<vector>
class A
{
public:
A(){
Print();
}
virtual void FuncA(){}
virtual void Print()
{
uint64_t* vptr = (uint64_t*)(*((uint64_t*)this)); // 取虚指针
std::cout << "A::vptr: " << vptr << std::endl; // 输出虚指针
std::cout << "A::FuncA: " << (void*)(&A::FuncA) << std::endl; // 输出A::FuncA地址
std::cout << "A::Print: " << (void*)(&A::Print) << std::endl; // 输出A::Print地址
std::cout << "A::vtable[0]: " << (void*)(vptr[0]) << std::endl; // 输出虚函数表第一个函数的地址
std::cout << "A::vtable[1]: " << (void*)(vptr[1]) << std::endl; // 输出虚函数表第二个函数的地址
}
};
class B: public A
{
public:
B():A(){
Print();
}
virtual void Print()
{
uint64_t* vptr = (uint64_t*)(*((uint64_t*)this));
std::cout << "B::vptr: " << vptr << std::endl;
std::cout << "B::FuncA: " << (void*)(&B::FuncA) << std::endl;
std::cout << "B::Print: " << (void*)(&B::Print) << std::endl;
std::cout << "B::vtable[0]: " << (void*)(vptr[0]) << std::endl;
std::cout << "B::vtable[1]: " << (void*)(vptr[1]) << std::endl;
}
};
int main()
{
B b;
return 0;
}输出结果
A::vptr: 0x4020d8
A::FuncA: 0x40121c
A::Print: 0x401228
A::vtable[0]: 0x40121c
A::vtable[1]: 0x401228
B::vptr: 0x4020b8
B::FuncA: 0x40121c
B::Print: 0x40135a
B::vtable[0]: 0x40121c
B::vtable[1]: 0x40135a子类执行父类构造函数时能正确调用父类的虚函数
A::vptr: 0x4020d8
B::vptr: 0x4020b8
先执行A的构造函数,此时虚指针会被赋值为A类的虚指针,调用的为父类的虚函数
再执行B的构造函数,此时虚指针会被赋值为B类的虚指针,调用的为子类重写的虚函数
即使重写了父类的虚函数,在执行父类构造函数时调用虚函数,调用的为父类的虚函数而不是子类。保证虚函数能够正确被调用
单继承情况下,vptr验证
A::vptr: 0x4020d8
B::vptr: 0x4020b8
头个8字节为虚指针,子类的虚指针不同于父类的虚指针
A::FuncA: 0x401228
A::Print: 0x401234
A::vtable[0]: 0x401228
A::vtable[1]: 0x401234B::FuncA: 0x401228
B::Print: 0x401366
B::vtable[0]: 0x401228
B::vtable[1]: 0x401366
虚指针指向vtable,函数地址与定义顺序一致
从虚函数地址表可以看出,没被重写的方法函数地址没有变化,被重写的函数地址发生了变化
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
hello
华纳公司开户注册步骤?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
如何申请华纳公司账户?
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】
东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】
华纳圣淘沙官网开户入口(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司在线开户教程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙网上开户步骤(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司移动端开户指南183-8890-9465—?薇-STS5099【6011643】
数字化开户:华纳圣淘沙公司指南183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司远程开户解决方案183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙线上开户操作手册183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户新手教程
零基础学会(183-8890-9465薇-STS5099)
华纳圣淘沙公司开户
华纳圣淘沙公司开户保姆级教程(183-8890-9465薇-STS5099)
一步步教你开通华纳圣淘沙公司账户(183-8890-9465薇-STS5099)
华纳圣淘沙公司开户分步图解
首次开户必看:(183-8890-9465薇-STS5099)
华纳圣淘沙全攻略
华纳圣淘沙公司开户实操手册(183-8890-9465薇-STS5099)
华纳圣淘沙开户流程视频教程
手把手教学:(183-8890-9465薇-STS5099)
华纳圣淘沙公司开户
华纳圣淘沙公司开户完全指南(183-8890-9465薇-STS5099)
华纳公司官方开户渠道?(183-8890-9465)-薇-STS5099【6011643】
如何通过官方渠道申请华纳公司账户?(183-8890-9465)-薇-STS5099【6011643】
华纳总公司官方开户指南?(183-8890-9465)-薇-STS5099【6011643】
华纳公司官方开户所需材料?(183-8890-9465)-薇-STS5099【6011643】
华纳官方开户流程?(183-8890-9465)-薇-STS5099【6011643】
华纳公司官方开户申请步骤?(183-8890-9465)-薇-STS5099【6011643】
华纳官方开户指南?(183-8890-9465)-薇-STS5099【6011643】
华纳总公司官方开户?(183-8890-9465)-薇-STS5099【6011643】
华纳公司官方开户所需材料?(183-8890-9465)-薇-STS5099【6011643】
华纳官方开户申请流程?(183-8890-9465)-薇-STS5099【6011643】