双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

问个虚函数表的问题。

贪食蛇男 贪食蛇男 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
同一个类使用同一个虚函数表,而不是每个对象有不同的虚函数表,这是CPP标准还是厂商自己的实现?
代码如下:

#include <windows.h>
#include <stdio.h>

class A
{
public:
virtual void print()
{
printf("A的函数\n");
}
};

void print()
{
printf("__cdecl 的函数\n");
}

int main()
{
A* a = new A();
a->print();
int** i = (int**)a;
DWORD oldP;
VirtualProtect(i[0], 20, PAGE_EXECUTE_WRITECOPY, &oldP);
i[0][0] = (int)print;
a->print();
A* b = new A();
b->print();
delete a;
delete b;
return 0;
}

...全文

相关推荐

C++虚函数表实例分析

多态是C++面向对象程序设计的一个重要特性。以前看到虚函数觉得很神奇,为什么就能实现多态了呢。最初的时候曾设想,要实现运行时多态,应该让对象的某个部分始终指向一个固定的地址,子类继承的时候,就修改这个地址的内容。这样,父类和子类都是到同一个固定地址去读取内容,在运行时就能表现不同行为。 在看了《深度探索c++对象模型》之后,发现思路是类似的。在对象中,有一个指针指向一张虚函数表,里面按照次序存放了每一个虚函数,当子类继承的时候,即到虚函数表的指定位置去修改函数地址。当我们通过父类指针来操作一个子类的时候,调用虚函数,都是通过虚函数表+固定的偏移,这样运行期多态便实现了。 在深度《深度》这本书中

weixin_38618024

C++中的虚函数表图解

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。

lidh5735

C++虚函数及虚函数表解析

C++虚函数及虚函数表解析,内容详细,分析清晰,推荐给大家。

lljnh

C++ 多态 虚函数 虚函数表 最是详细

高质量的C++多态讲解,详细讲解虚函数,虚函数表,虚函数继承,虚函数继承下的内存分配等

sunqichang2012

(转)多重继承下的虚函数表

多态是C++语言中的一项重要的机制,虚函数就是为实现多态而设计的。多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”。而虚函数表在这种多态机制中起了核心调度的作用。由于是编译器在后台操作,所以它被蒙上了一层神秘的面纱。 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为VFTable。 在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,VFTable就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。在C++的标准中提到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置。 这意味着我们通过对象实例的地址得到它的VFTable,然后就可以遍历其中函数指针,并调用相应的函数。

smallnang
评论 16
收藏 已收藏
分享
返回顶部
贪食蛇男
C++ 语言 65,214 成员 250,514 内容