虚函数与虚指针到底它们分别是存放在类里还是对象里面呢???

kkndciapp 2008-07-27 08:27:08
请教下大家,谢谢
class a
{
protected:
virtual void test(){cout<<"aaa"<<endl;}
virtual void test1(){cout<<"df"<<endl;}
};
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??
问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??
问题3:
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢???从上面两个例子好像看不到明确的答案,似乎类和对象都没存放
...全文
1212 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
once_and_again 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 Zhou_Andy 的回复:]
引用 18 楼 yndfcd 的回复:
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??
的确是个指针的大小,但是并不是指针虚函数,而是指向虚表,虚表里存放的才是虚函数的指针.

问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??
类不是一个可以存贮东西的地方,类的概念只存在于编译期间,因为只能存放在对象里.

问题3:
虚指针是个函…
[/Quote]


虚函数表,是 指针数组函数吧
所谓的表就是 数组而已,看数组里存储的什么
once_and_again 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yangf1983 的回复:]
楼主应该看看《inside the c++ object model》
[/Quote]只有引用的内容不允许回复!!
SeanHwang 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 iu_81 的回复:]
虚函数表是存在对象里的。
[/Quote]
Bingo~
SeanHwang 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 iu_81 的回复:]
虚函数表是存在对象里的。
[/Quote]
Bingo~
jackey_option 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yndfcd 的回复:]
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??
的确是个指针的大小,但是并不是指针虚函数,而是指向虚表,虚表里存放的才是虚函数的指针.

问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??
类不是一个可以存贮东西的地方,类的概念只存在于编译期间,因为只能存放在对象里.

问题3:
虚指针是个函数指针,指向虚函数表…
[/Quote]

此是正解!很详细!

有虚函数的类,其对象占用的内存空间的前四个字节存放指向虚表的指针。
yndfcd 2008-09-23
  • 打赏
  • 举报
回复
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??
的确是个指针的大小,但是并不是指针虚函数,而是指向虚表,虚表里存放的才是虚函数的指针.

问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??
类不是一个可以存贮东西的地方,类的概念只存在于编译期间,因为只能存放在对象里.

问题3:
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢???从上面两个例子好像看不到明确的答案,似乎类和对象都没存放
虚表是整个类共用的,他的大小取决于你定义的虚函数的个数,以及编译器的策略.一般存在于内存的某个地方,你不需要去管他.
yangf1983 2008-09-23
  • 打赏
  • 举报
回复
楼主应该看看《inside the c++ object model》
qinzhonghello 2008-09-23
  • 打赏
  • 举报
回复
学习中!
arong1234 2008-07-27
  • 打赏
  • 举报
回复 1
sizeof的参数如果是对象,则计算对象的大小,如果是类型,则计算该类型所属对象的大小,所以sizeof(a)当然是这个对象的大小,而你的例子这个对象只有一个虚表,当然就是4
无论你继承多少层,虚表都在继承树上第一个祖先最前面的位置(也许是第一个有虚函数的类的前面,但是对于有派生类的类,其析构函数至少是虚的,因此这不是大问题)
[Quote=引用 10 楼 kkndciapp 的回复:]
如果虚表是存在对象里,那么sizeof(a)=sizeof(aa)=4,这是什么的大小??
[/Quote]
  • 打赏
  • 举报
回复
虚表的指针.

sizeof是求类型的大小,你写的是变量的话,那么就是变量的类型大小
kkndciapp 2008-07-27
  • 打赏
  • 举报
回复
如果虚表是存在对象里,那么sizeof(a)=sizeof(aa)=4,这是什么的大小??
  • 打赏
  • 举报
回复
看一下这个就知道了

//用C来实现C++虚表机制
//理论可以用函数指针和结构体的语言都可以实现

//-------------------------------C++的对象构建,确定虚表结构-------------------------------
class IDispath
{
public:
virtual void __stdcall Find() = 0;
virtual void __stdcall Invoke(int x) = 0;
};

class ITest :public IDispath
{
public:
virtual void __stdcall Use() = 0;
};
class CTest :public ITest
{
public:
void __stdcall Find()
{
printf("Find\n");
};
void __stdcall Invoke(int x)
{
printf("Invoke(%d)\n",x);
};
void __stdcall Use()
{
printf("use\n");
};
};
//-------------------------------C 部分构造和C++对象相同的虚表结构-------------------------------
typedef struct STest STest;
struct vtpr//虚表内容
{
void (__stdcall *Find)( STest* This);//虚表所对应的函数指针 第一个参数为对象的this指针
void (__stdcall *Invoke)( STest* This,int x);
void (__stdcall *Use)( STest* This);
};
struct STest
{
struct vtpr * p;//虚表指针
};


int main(int argc, char* argv[])
{
CTest* t =new CTest;

//利用C构建的虚表进行函数调用
STest* pTest = (STest*)t;
pTest->p->Find(pTest);
pTest->p->Invoke(pTest,23);
pTest->p->Use(pTest);

delete t;
return 0;
}
yydrewdrew 2008-07-27
  • 打赏
  • 举报
回复
一个类(有虚函数)一张虚表,虚表一般在代码段中
类实例中存放指向虚表的指针。
虚标存放该类的信息和虚函数指针
比如:
slot 0为类型信息
slot 1为虚析构函数指针
slot 2其他虚函数指针
。。。
guolisen 2008-07-27
  • 打赏
  • 举报
回复
每个对象中有虚指针(如果有虚函数),指向一张虚函数表
iu_81 2008-07-27
  • 打赏
  • 举报
回复
虚函数表是存在对象里的。
junsky2006 2008-07-27
  • 打赏
  • 举报
回复
应该是指向最外层子类的
wjb_yd 2008-07-27
  • 打赏
  • 举报
回复
所有同类对象,共享一个vtable,但是每个对象都自带一个vptr指向这个vtable,否则调用虚函数的时候会找不到正确的函数入口
wjb_yd 2008-07-27
  • 打赏
  • 举报
回复
问题1:
sizeof(a)=4,这个4应该是个指针大小,代表虚指针,但是如果这样的话是不是应该有两个指针呢??

//一个指针,指向一个虚函数入口表,这个表里有2项

问题2:
还有一个地方是 a aa; sizeof(aa)=4,那么到底是虚指针是存在类里面还是类的对象里面呢??

//sizeof(aa)都等于4了,当然是在类对象里了,每个同类对象中都有个vptr,指向内存中的vtable,vptr就是4byte

问题3:
虚指针是个函数指针,指向虚函数表里面的位置,那么虚函数表是存在哪里的呢??大小又是多少呢???从上面两个例子好像看不到明确的答案,似乎类和对象都没存放

//vtable放在内存中,大小根据类形态不同而异
kkndciapp 2008-07-27
  • 打赏
  • 举报
回复
谢谢1楼提示,我试过了
class b:public a
{
virtual void teset2(){}
};

void main()
{
b bb;
cout<<sizeof(b)<<sizeof(bb);//大小都是4
}
不论基类还是派生类,也不论它们有多少个虚函数,类和对象大小都是4,这个是个指针的大小,但是这个指针指向谁呢?(b继承下来的时候已经有三个虚函数了)
虚函数表存在哪里了呢?
五号智能 2008-07-27
  • 打赏
  • 举报
回复
早啊,您应该试试,让一个类继承于此类。然后测试一下基类与对象的大小。不过俺也没测试过,嘿
加载更多回复(3)

64,676

社区成员

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

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