读书人

C++对象模型一个有关问题: sizeof得到

发布时间: 2012-03-29 12:53:12 作者: rapoo

C++对象模型一个问题: sizeof得到的大小和我想象的不一样!
我知道的基础知识: 一个类有虚函数,就有了虚指针,size+4。无论有多少个虚函数,都只有一个虚指针,size还是+4。虚指针指向虚函数表。

为什么下面的程序中,s3的大小是4? 我觉得是8才对。
s5继承了两个父类,自己也有virtual函数,那么我认为,在32位系统上,它应该有3个虚表指针,大小应该是12。但是运行结果却是8。我尝试了vc2005/2010,一样的效果,程序运行打印4,4,4,8,8.

我的问题是,既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?

C/C++ code
#include "stdafx.h" #include <string> using namespace std; struct s1{      virtual void f(); }; struct s2{      virtual void g(); }; struct s3: public s1{      virtual void f(); }; struct s4: public s1,s2{//s4的大小是8,我理解。 }; struct s5: public s1,s2{//s5的大小是8,我就不理解了。难道不是12么?      virtual void h(); }; int  main( void){      printf("%d,%d,%d,%d,%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4),sizeof(s5));      return 0; } 




[解决办法]
看<深度探索C++对象模型>

s5的虚函数表是和s1,s2其中一个共用的.
[解决办法]
既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?
冲突不冲突得看能否保证子类的完整性。
[解决办法]
两个父类之间没有继承关系 不能共用

读书人网 >C++

热点推荐