转自:http://zhidao.baidu.com/question/249749363.html
#include<iostream>
using namespace std;
class A{};
class B{};
class C:public virtual A,public virtual B{};
int main()
{
cout<<sizeof(C);
return 0;
}
输出是8
#include<iostream>
using namespace std;
class A{void virtual fun(){}};
class B{void virtual fun(){}};
class C:public A,public B{};
int main()
{
cout<<sizeof(C);
return 0;
}输出是 8
但是
#include<iostream>
using namespace std;
class A{void virtual fun(){}};
class B{void virtual fun(){}};
class C:public virtual A,public virtual B{};
int main()
{
cout<<sizeof(C);
return 0;
}
却输出是12 按理应该是16吧 我用的是vc6.0编译器 望高手给我解决这个问题
--------------------------------------------
回答:
sizeof(A) + sizeof(B) + sizeof(class_ptr) class_ptr即类指针,指向virtual说明的虚基类列表 注意,这里面存在内存对齐规则 第一个代码: sizeof(A) + sizeof(B) + sizeof(class_ptr) = 1 + 1 + 4, 对齐,得到8 第二个代码: sizeof(A) + sizeof(B) = sizeof(vptr) + sizeof(vptr) = 4 + 4 = 8,虚函数表指针 第三个代码: sizeof(A) + sizeof(B) + sizeof(class_ptr) = 4 + 4 + 4 = 12 就是在第二个的基础上多了一个class_ptr,无论多少个类,都只有一个class_ptr指向这一系列的virtual class。(注意,这很关键。类指针,也即虚基指针,vbptr,是一个用来获得虚基类位置离当前类对象位置偏移的指针,自身位置信息在vtable中虚基类位置信息的下一行给出。可参考http://blog.youkuaiyun.com/onlyonename/article/details/8062756。至于为什么多个虚继承只有一个类指针,人个猜可能是各个虚基类的位置按书写的继承先后顺序依次存放在vtable中,类指针指向表中第一个书写的虚基类。相关参考文献有http://blog.youkuaiyun.com/onlyonename/article/details/8068871,http://blog.youkuaiyun.com/onlyonename/article/details/8068990,http://blog.youkuaiyun.com/onlyonename/article/details/7040913,http://blog.youkuaiyun.com/onlyonename/article/details/7041115,http://blog.youkuaiyun.com/onlyonename/article/details/7041255 by orc)追问
回答
追问
回答
1833

被折叠的 条评论
为什么被折叠?



