C++ 关于类与对象在虚函数表上唯一性问题 浅析

【摘要】

VTABLE虚函数表只有一个;也有的在说,每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针。今天,我们就来解决这个问题,同一个类的不同对象,是不是拥有“相同”的虚函数表,这个相同是物理上的相同(内存地址)还是逻辑上的相同(数据结构)。本文现详述如下!

【正文】

虚函数表:虚函数表是顺序存放虚函数地址的,虚表是顺序表,表里存放了虚函数的地址。

【代码示例】

#include <iostream>using namespace std; class Base {public:virtual void f() { cout << "Base::f" << endl; }virtual void g() { cout << "Base::g" << endl; }virtual void h() { cout << "Base::h" << endl; } };typedef void(*Fun)(void);int main(){Fun pFun = NULL;Base obj_1,obj_2;// obj_1 虚函数表 — 第一个函数pFun = (Fun)*((int*)*(int*)(&obj_1));pFun();pFun = (Fun)*(((int*)*(int*)(&obj_1))+1);pFun();// 输出 虚函数表地址 与 虚函数表元素 的值cout << "obj_1 虚函数表地址:" << (int*)(&obj_1) << endl;cout << "obj_2 虚函数表地址:" << (int*)(&obj_2) << endl;cout << "obj_1 虚函数表 — 第一个函数地址:" << (int*)*(int*)(&obj_1) << endl;cout << "obj_2 虚函数表 — 第一个函数地址:" << (int*)*(int*)(&obj_2) << endl;return 0;}/*输出 :Base::fBase::g obj_1 虚函数表地址:0018FF40obj_2 虚函数表地址:0018FF3Cobj_1 虚函数表 — 第一个函数地址:0046F0ACobj_2 虚函数表 — 第一个函数地址:0046F0ACPress any key to continue*/

【结论】

不同对象虚函数表表中元素是相等的,逻辑上是一样的,存放的都是类中虚函数的地址;

不同对象虚函数表的内存地址是不一样,物理上是不一样的,一个对象是一个新的表。

【相关推荐】

详见:C++ 虚函数表解析

详址:#comments

版权声明:本文为博主原创文章,未经博主允许不得转载。

,人生最大的错误是不断担心会犯错

C++ 关于类与对象在虚函数表上唯一性问题 浅析

相关文章:

你感兴趣的文章:

标签云: