- 论坛徽章:
- 0
|
20可用积分
一个对象,自己有virtual函数,继承了父类的virtual函数,那么就相当于有了两个虚函数指针。
下面的程序中,s5继承了两个父类,自己也有virtual函数,那么我认为,在32位系统上,它应该有3个虚表指针,大小应该是12。
但是运行结果却是8。我尝试了vc2005/2010,一样的效果:
- #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;
- }
复制代码 我认为s5的对象应该是这样子长的:
----------------
| s1 vtbl_ptr |
----------------
| s2 vtbl_ptr |
----------------
| s5 vtbl_ptr |
----------------
为什么和我想象的不一样呢? |
最佳答案
查看完整内容
回复 10# donet8 仔细看我在9楼的帖子,编译器必须在对象构造的时候就给 vptr 赋值。等到虚函数调用的时候,只要把 vptr 的值加上具体虚函数的偏移量,就找到了正确的入口。这就要求,同一个虚函数在父类和子类的虚表中,必须保持相同的偏移量。假设 f(), g() 来自父类 B1, x(), y() 来自父类 B2,D 同时继承B1 和 B2假设f(),g() 在 B1 的虚表中位于第1位和第2位;那么它们在D的虚表中就也必须在第1位和第2位;同样x(),y() 在 B2 ...
|