虚基类子对象有关问题

虚基类子对象问题
代码来源——《C++释难解惑》
三段代码:
第一段:
include <iostream>
using namespace std;
class base
{
int b;
};
class base1:virtual public base
{
int b1;
};
class base2:virtual public base
{
int b2;
};
class derived:public base1, public base2
{
float d;
};

int main()
{
derived obj;
cout<<sizeof(obj)<<endl;           //该输出书中已解释
return 0;
}


第二段:
include <iostream>

using namespace std;

class base
{
int b;
};
class base1:public base
{
int b1;
};
class base2:public base
{
int b2;
};
class derived:public base1, public base2
{
float d;
};

int main()
{
derived obj;
cout<<sizeof(obj)<<endl;     //自己编译了一下,输出20,求解释原因
return 0;
}


第三段:
include <iostream>

using namespace std;

class base
{
int b;
};
class base1:virtual public base
{
int b1;
};
class base2:public base
{
int b2;
};
class derived:public base1, public base2
{
float d;
};

int main()
{
derived obj;
cout<<sizeof(obj)<<endl;               //输出24,求解释原因
return 0;
}


我的编译器是vs2010,求解释,可以说明下大致运行机理吗?
谢谢!

------解决方案--------------------
上述程序的结果可能与平台有关,这里仅回答一下lz的问题,更细节的东西lz可以查一下虚继承以及虚函数表的相关资料:
一、第二段程序中
(1)首先要知道非虚继承,就是获得父类的全部(当然,一个对象只有一个虚表指针),所以
base1 : public base, base2 : public base
使得base1和base2中都包含父类base中全部,而父类base中仅有一个int变量,base1和base2中也都只有一个int变量,所以base1中实际包含了2个int变量,base2中实际包含了2个int变量
(2)derived : public base1, public base2
使得derived包含父类base1和base2的全部,而父类base1中有2个int变量,base2中有2个int变量,所以derived中实际上包含了5个int变量,所以sizeof(derived) = 20
二、第三段程序中
首先要知道虚继承的子类在包含父类的同时,多了一个指向父类的虚指针vptr,即有
base1 : virtual public base使得base1中包含2个int变量和一个虚指针vptr
base2 : public base使得base2中实际包含了2个int变量
derived : public base1, public base2使得derived中包含5个int变量和一个虚指针,所以sizeof(derived) = 24

------解决方案--------------------
第二段里,4个standard layout类:
sizeof(base) == sizeof(base::b)
sizeof(base1) == sizeof(base1::b1) + aligned_sizeof(base)
sizeof(base2) == sizeof(base2::b2) + aligned_sizeof(base)
sizeof(derived) == sizeof(derived::d) + aligned_sizeof(base1) + aligned_sizeof(base2)

第三段里,只有base, base2是standard layout,base1和derived都不是,其布局可能因编译器和平台而不同,我觉得貌似不太好说的样子。

第一段代码同上
------解决方案--------------------
额。我搞错了啊。 二楼说的蛮正确的,不过那个网址解释的很清楚。
------解决方案--------------------
引用:
上述程序的结果可能与平台有关,这里仅回答一下lz的问题,更细节的东西lz可以查一下虚继承以及虚函数表的相关资料:
一、第二段程序中
(1)首先要知道非虚继承,就是获得父类的全部(当然,一个对象只有一个虚表指针),所以
base1 : public base, base2 : public base
使得base1和base2中都包含父类base中全部,而父类base中仅有一个int变量,base1和base2中也都只有一个int变量,所以base1中实际包含了2个int变量,base2中实际包含了2个int变量
(2)derived : public base1, public base2
使得derived包含父类base1和base2的全部,而父类base1中有2个int变量,base2中有2个int变量,所以derived中实际上包含了5个int变量,所以sizeof(derived) = 20
二、第三段程序中
首先要知道虚继承的子类在包含父类的同时,多了一个指向父类的虚指针vptr,即有
base1 : virtual public base使得base1中包含2个int变量和一个虚指针vptr
base2 : public base使得base2中实际包含了2个int变量
derived : public base1, public base2使得derived中包含5个int变量和一个虚指针,所以sizeof(derived) = 24
虚基类子对象有关问题