首先:

#include <iostream>
using namespace std;

class A
{
public:
    void foo(){}
};

class B:public A
{
public:
    void foo(){}
};

class C:public A
{
public:
    void foo(){}
};

class D: public B,public C
{
public:
    void foo(){}
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    C c;
    D d;
    cout<<"A 的大小为: "<<sizeof(A)<<endl;
    cout<<"B 的大小为: "<<sizeof(B)<<endl;
    cout<<"C 的大小为: "<<sizeof(C)<<endl;
    cout<<"D 的大小为: "<<sizeof(D)<<endl;
    return 0;
}
/* output
A 的大小为: 1
B 的大小为: 1
C 的大小为: 1
D 的大小为: 1
*/

然后是有虚函数的

#include <iostream>
using namespace std;

class A
{
public:
    virtual void foo(){}
};

class B:public A
{
public:
    void foo(){}
};

class C:public A
{
public:
    void foo(){}
};

class D: public B,public C
{
public:
    void foo(){}
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    C c;
    D d;
    cout<<"A 的大小为: "<<sizeof(A)<<endl;
    cout<<"B 的大小为: "<<sizeof(B)<<endl;
    cout<<"C 的大小为: "<<sizeof(C)<<endl;
    cout<<"D 的大小为: "<<sizeof(D)<<endl;
    return 0;
}
/* output
A 的大小为: 4
B 的大小为: 4
C 的大小为: 4
D 的大小为: 8
*/

由于A中foo为虚函数,因此A对象内有一个指向虚函数表的指针,即A对象大小为4。B和C均为单继承,所以也只有一个虚函数指针,也为4字节。D有继承自两个类,且两个类均有虚函数,故有两个虚函数表指针,所以为8字节。

再者,看看虚继承的情况

#include <iostream>
using namespace std;

class A
{
public:
    void foo(){}
};

class B:virtual public A
{
public:
    void foo(){}
};

class C:virtual public A
{
public:
    void foo(){}
};

class D: public B,public C
{
public:
    void foo(){}
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    C c;
    D d;
    cout<<"A 的大小为: "<<sizeof(A)<<endl;
    cout<<"B 的大小为: "<<sizeof(B)<<endl;
    cout<<"C 的大小为: "<<sizeof(C)<<endl;
    cout<<"D 的大小为: "<<sizeof(D)<<endl;
    return 0;
}
/* output
A 的大小为: 1
B 的大小为: 4
C 的大小为: 4
D 的大小为: 8
*/

对虚继承的结果表示不理解,听说《深度探索C++对象模型》有介绍,要抽个时间看一看。

以上试验均在VS2008环境下编译运行。