问个虚函数表的问题。

贪食蛇男 2011-07-06 03:42:26
同一个类使用同一个虚函数表,而不是每个对象有不同的虚函数表,这是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;
}

...全文
143 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸟辉 2011-07-06
  • 打赏
  • 举报
回复
mark下。做到知其然也知其所以然,不易
机智的呆呆 2011-07-06
  • 打赏
  • 举报
回复

c++只规定了虚函数的行为,并没有规定如何实现,也没有规定虚函数必须用虚表来实现。
forster 2011-07-06
  • 打赏
  • 举报
回复
标准统一 实现不同
Proteas 2011-07-06
  • 打赏
  • 举报
回复
虚函数表编译期应该就确定好了。
ryfdizuo 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hiroyukki 的回复:]
的确,看来无论是出于空间考虑还是出于效率考虑都应使用静态的表。
这个表根据类的声明和继承树,在编译期就可以决定,然后就应该是写死的了。
如果生成对象时为其生成虚表,就会导致额外的一次内存分配,当然随之而来的是额外的空间占用。
谢谢大家。

引用 8 楼 babilife 的回复:

引用 7 楼 luciferisnotsatan 的回复:
只知道标准没规定虚指针必须放在类中的哪个……
[/Quote]
正如你说每个类共享一份虚函数表,是全局的。
Jxiaoshen 2011-07-06
  • 打赏
  • 举报
回复
同一个类只有一个虚表,创建对象时,只在虚表中增加一个4字节的指针
学习
贪食蛇男 2011-07-06
  • 打赏
  • 举报
回复
的确,看来无论是出于空间考虑还是出于效率考虑都应使用静态的表。
这个表根据类的声明和继承树,在编译期就可以决定,然后就应该是写死的了。
如果生成对象时为其生成虚表,就会导致额外的一次内存分配,当然随之而来的是额外的空间占用。
谢谢大家。
[Quote=引用 8 楼 babilife 的回复:]

引用 7 楼 luciferisnotsatan 的回复:
只知道标准没规定虚指针必须放在类中的哪个位置


顶,程序只有一个虚函数,你 i[0][0] = (int)print;是没问题


你的程序证明了
同一个类使用同一个虚函数表,而不是每个对象有不同的虚函数表,这个应该是cpp标准,如果是每个对象都有虚函数表,那开销也太大了饿
[/Quote]
至善者善之敌 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]
只知道标准没规定虚指针必须放在类中的哪个位置
[/Quote]

顶,程序只有一个虚函数,你 i[0][0] = (int)print;是没问题


你的程序证明了
同一个类使用同一个虚函数表,而不是每个对象有不同的虚函数表,这个应该是cpp标准,如果是每个对象都有虚函数表,那开销也太大了饿
luciferisnotsatan 2011-07-06
  • 打赏
  • 举报
回复
只知道标准没规定虚指针必须放在类中的哪个位置
帅得不敢出门 2011-07-06
  • 打赏
  • 举报
回复
你可以看看深度探索c++对象模型。
luciferisnotsatan 2011-07-06
  • 打赏
  • 举报
回复
静态的,是不是标准规定的不太清楚。
贪食蛇男 2011-07-06
  • 打赏
  • 举报
回复
我问的就是这个,指向的虚表,是一个静态的数组是吧?而不是生成对象的时候再生成一个虚表,并与此对象关联起来?
如果是静态的,那这是CPP的标准规定的吗?
[Quote=引用 2 楼 q191201771 的回复:]

对象只 需要一个4个字节的指针 指向 虚表就行了
[/Quote]
至善者善之敌 2011-07-06
  • 打赏
  • 举报
回复
我喜欢这样的帖子,等我先研究一下
就想叫yoko 2011-07-06
  • 打赏
  • 举报
回复
对象只 需要一个4个字节的指针 指向 虚表就行了
贪食蛇男 2011-07-06
  • 打赏
  • 举报
回复
cl和g++生成的代码中,修改 a的虚函数表都对对象b造成了影响。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧