还是用最简单的多继承来看,猜猜输出会是什么:
- class A{
- public:
- int n;
- void f(){cout<<"A.f"<<endl;}
- };
- class B: virtual public A{
- public:
- char bn;
- B(){cout<<"C"<<endl;}
- };
- class C: virtual public A{
- public:
- int cn;
- C(){cout<<"C"<<endl;}
- };
- class D: public B,public C{
- public:
- double dn;
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //E cy;cy.f();
- cout<<sizeof(A)<<endl;
- cout<<sizeof(B)<<endl;
- cout<<sizeof(C)<<endl;
- cout<<sizeof(D)<<endl;
- system("Pause");
- return 0;
- }
我在VS2005下运行结果是:
4
12
12
28
后来用g++运行了一下,结果一样。
笼统的原理书上都有,就不说了,这里继承结果大致是这样的,最后D中的确只有A的一份拷贝了,但是附带的东西全都加进来了...
由于增加了虚继承指针和新的成员变量,B、C因为字节对齐的原因相对A都是总共多了8,D中包含了每个父类B、C的虚继承指针(大小:4+(8+8)+8=28)...