//轉自 http://www.rosoo.net/a/201307/16686.html

//關于sizeof(class)的學習
//問題1:空類            1byte
//問題2:虛類            成員變量+虛表  注意字節對齊
//問題3:單繼承類        
//問題4:多繼承類        各個繼承類的空間之和 
//問題5:虛繼承類        各個繼承類的空間之和,再擴展出來的虛表


#include 
"stdafx.h"

#include 
<iostream>
#include 
<string>
using namespace std;

class Base
{
public:
    
int m_a;
    Base()
{}
    
~Base()    {}
    
void g2(int i = 10)    {}
private:
    
int m_b;
}
;
class Derived:public Base
{
public:
    Derived()    
{}
    
~Derived()    {}
    
virtual void g(int i=20){}////虛表4 bytes
}
;
class A
{
public:
    
double m_d;//8
    virtual void func1(){}//虛表4 bytes ,為了保存內存對齊,額外消耗4 bytes
}
;
class A1:public A{};//* 原封不動的繼承
class A2:public A{};
class B :public A{};
class C :public virtual A1,public virtual A2{};//* 虛繼承,
class D :public A1,public A2{};
class E{};//*空類1byte

int _tmain(int argc, _TCHAR* argv[])
{
    Base b;
    Derived d;
    Base 
*pb = new Derived;
    E e;

    
int n1     = sizeof(Base);//8
    int n2     = sizeof(b);   //8
    int n3     = sizeof(*pb); //8
    int n4     = sizeof(pb);//
    int n5  = sizeof(d);//12
    int n6  = sizeof(A);//16
    int n7  = sizeof(A1);//16
    int n8  = sizeof(A2);//16
    int n9  = sizeof(B);//16
    int n10 = sizeof(C);//40
    int n11 = sizeof(D);//32
    int n12 = sizeof(E);//1
    int n13 = sizeof(e);//1 空類占用的空間也最少(即1字節)
    return 0;
}