C++对象模型一个有关问题: sizeof得到的大小和小弟我想象的不一样
C++对象模型一个问题: sizeof得到的大小和我想象的不一样!
我知道的基础知识: 一个类有虚函数,就有了虚指针,size+4。无论有多少个虚函数,都只有一个虚指针,size还是+4。虚指针指向虚函数表。
为什么下面的程序中,s3的大小是4? 我觉得是8才对。
s5继承了两个父类,自己也有virtual函数,那么我认为,在32位系统上,它应该有3个虚表指针,大小应该是12。但是运行结果却是8。我尝试了vc2005/2010,一样的效果,程序运行打印4,4,4,8,8.
我的问题是,既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?
------解决方案--------------------
看<深度探索C++对象模型>
s5的虚函数表是和s1,s2其中一个共用的.
------解决方案--------------------
既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?
冲突不冲突得看能否保证子类的完整性。
------解决方案--------------------
两个父类之间没有继承关系 不能共用
我知道的基础知识: 一个类有虚函数,就有了虚指针,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其中一个共用的.
------解决方案--------------------
既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?
冲突不冲突得看能否保证子类的完整性。
------解决方案--------------------
两个父类之间没有继承关系 不能共用