关于虚函数的死择偶反

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;
}
...全文
158 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有什么区别?
代码下载链接: https://pan.quark.cn/s/90052d681b2f 本书系统地阐述了利用C语言进行程序开发的各种方法与技巧,全书总共分为十二个章节,涵盖了从基础到高级的多个方面,包括但不限于基础知识、指针运用、数据结构、算法设计、数学运算、文件处理、库函数应用、图形图像生成、系统调用、加密与安全机制、游戏开发以及综合案例等。整个书籍精心设计了三百个实例,每个实例都着重展示了其在实际应用中的价值。本书既适合作为C语言编程的入门教材供初学者研习,也能够为程序开发者、相关专业培训机构的教师和学生提供参考和借鉴。第一章聚焦于基础知识,详细介绍了进制转换、条件判断、多重循环图形打印、循环的数学应用、数组操作、字符与字符串处理、函数使用、趣味计算、宏定义与位运算等内容。第二章深入探讨了指针的相关知识,包括指针变量、指针与数组的关系、指针与函数的交互、字符串与指针的结合以及指向指针的指针运用。第三章着重于数据结构的学习,涵盖了结构体、链表、栈与队列、串与广义表、二叉树以及图及其应用等多个重要主题。第四章详细介绍了算法设计,涉及简单问题求解算法、排序算法、查找算法、数学定理与猜想以及逻辑推理与判断等内容。第五章围绕数学应用展开,讨论了素数问题、整数趣题、数学问题求解、矩阵运算以及生活中的数学实例。第六章专门讲解文件操作,包括了文件读写操作、文件内容处理、文件的创建与查找删除、以及文件相关操作等。第七章介绍了库函数的调用,涵盖了时间转换与操作函数、数学函数、字符串与字符函数以及其他各类函数的使用方法。第八章则聚焦于图形图像的处理,详细介绍了基本图形的绘制、色彩填充与使用技巧等。

65,211

社区成员

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

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