关于虚函数的死择偶反

guoxiaohua57 2009-04-27 10:59:34
class A
{
public:
int a;
virtual void f();
};

class B : public A
{
public:
int b;
//virtual void f();
};
void main()
{
cout<<sizeof(A)<<" "<<sizeof(B)<<endl;
}
...全文
159 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2009-04-27
  • 打赏
  • 举报
回复
它自己的虚指针vb_ptr应该也占四个字节,即a(4)+va_ptr(4)+b(4)+vb_ptr=16
=======================
这种理解是错的。如果定义了虚函数,则有个v_ptr。如果继承的基类定义了虚函数,则子类也会有个v_ptr,此时如果要重写基类的虚函数,则在v_ptr指向的v_table中修改相应的函数指针,如果要增加新的虚函数,则v_table增加相应函数指针项。不会是你理解的基类有一个v_ptr,子类又增加一个v_ptr。
Paradin 2009-04-27
  • 打赏
  • 举报
回复
那虚继承的布局是怎样的
0黄瓜0 2009-04-27
  • 打赏
  • 举报
回复
你就是定义100个虚函数,他还是那么大。类的大小里面只有va_ptr。 真正放函数指针的虚表在另 一个地方。
Jinhao 2009-04-27
  • 打赏
  • 举报
回复
通常情况是
sizeof(A) = sizeof(a) + sizeof(vptr)
sizeof(B) = sizeof(a) + sizeof(b) + sizeof(ptr)
  • 打赏
  • 举报
回复
一个类里不应该有2个同名虚函数,所以去掉也是12
cyldf 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoxiaohua57 的回复:]
引用楼主 guoxiaohua57 的帖子:
class A
{
public:
int a;
virtual void f();
};

class B : public A
{
public:
int b;
//virtual void f();
};
void main()
{
cout < <sizeof(A) < <" " < <sizeof(B) < <endl;
}


标题错了,关于虚函数的sizeof问题,问题如下:
为什么//virtual void f(); 这句注释掉与否sizeof(B)都是12?sizeof(A)=8是因为a(4)+va_ptr(4)=8,而对于B,未注释前,应…
[/Quote]
一个类只对应一个virtual table,一个virtual table只对应一个v_ptr
guoxiaohua57 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 guoxiaohua57 的帖子:]
class A
{
public:
int a;
virtual void f();
};

class B : public A
{
public:
int b;
//virtual void f();
};
void main()
{
cout < <sizeof(A) < <" " < <sizeof(B) < <endl;
}
[/Quote]

标题错了,关于虚函数的sizeof问题,问题如下:
为什么//virtual void f(); 这句注释掉与否sizeof(B)都是12?sizeof(A)=8是因为a(4)+va_ptr(4)=8,而对于B,未注释前,应该是a(4)+va_ptr(4)+b(4)=12没错;注释后,它自己的虚指针vb_ptr应该也占四个字节,即a(4)+va_ptr(4)+b(4)+vb_ptr=16,但是为什么结果还是12呢?
jinling4388 2009-04-27
  • 打赏
  • 举报
回复
8 12

个人认为是这样
cyldf 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guoxiaohua57 的回复:]
引用 9 楼 A_B_C_ABC 的回复:
它自己的虚指针vb_ptr应该也占四个字节,即a(4)+va_ptr(4)+b(4)+vb_ptr=16
=======================
这种理解是错的。如果定义了虚函数,则有个v_ptr。如果继承的基类定义了虚函数,则子类也会有个v_ptr,此时如果要重写基类的虚函数,则在v_ptr指向的v_table中修改相应的函数指针,如果要增加新的虚函数,则v_table增加相应函数指针项。不会是你理解的基类有一个v_ptr,子类又增加一个v_ptr。…
[/Quote]
类A v_ptr指向A的virtual table,A的virtual table中只有A的虚函数
类B v_ptr指向B的virtual table,B的virtual table中有从A继承来的但是没有被重写的虚函数,还有B自己定义的虚函数,再加上重写A的虚函数
guoxiaohua57 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 A_B_C_ABC 的回复:]
它自己的虚指针vb_ptr应该也占四个字节,即a(4)+va_ptr(4)+b(4)+vb_ptr=16
=======================
这种理解是错的。如果定义了虚函数,则有个v_ptr。如果继承的基类定义了虚函数,则子类也会有个v_ptr,此时如果要重写基类的虚函数,则在v_ptr指向的v_table中修改相应的函数指针,如果要增加新的虚函数,则v_table增加相应函数指针项。不会是你理解的基类有一个v_ptr,子类又增加一个v_ptr。
[/Quote]
那么类A中的v_ptr和类B中的v_ptr有什么区别?

65,211

社区成员

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

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