C++ 學習(虛基類)

#include <iostream>
//基類
using namespace std;
class CBase
{
protected:
    int a;
public:
    CBase(int na)
    {
        a=na;
        cout<<"CBase constructor! "<<endl;
    }

    ~CBase(){cout<<"CBase deconstructor! "<<endl;}
};

//派生類1(聲明CBase爲虛基類)
class CDerive1:virtual public CBase
{
public:
    CDerive1(int na):CBase(na)
    {
        cout<<"CDerive1 constructor! "<<endl;
    }

    ~CDerive1(){cout<<"CDerive1 deconstructor! "<<endl;}

    int GetA(){return a;}
};

//派生類2(聲明CBase爲虛基類)
class CDerive2:virtual public CBase
{
public:
    CDerive2(int na):CBase(na)
    {
        cout<<"CDerive2 constructor! "<<endl;
    }
    ~CDerive2(){cout<<"CDerive2 deconstructor! "<<endl;}
    int GetA(){return a;}
};

//子派生類
class CDerive12:public CDerive1,public CDerive2
{
public:
    CDerive12(int na1,int na2,int na3):CDerive1(na1),CDerive2(na2),CBase(na3)
    {
        cout<<"CDerive12 constructor! "<<endl;
    }
    ~CDerive12(){cout<<"CDerive12 deconstructor! "<<endl;}
};
int main()
{
    CDerive12 obj(100,200,300);
    //得到從CDerive1繼承的值
    cout<<" from CDerive1 : a = "<<obj.CDerive1::GetA();
    //得到從CDerive2繼承的值
    cout<<" from CDerive2 : a = "<<obj.CDerive2::GetA()<<endl<<endl;
    return 0;
}


參考: http://blog.chinaunix.net/uid-26983585-id-3309645.html

             http://blog.csdn.net/livelylittlefish/article/details/2171267

            http://blog.sina.com.cn/s/blog_4a286b4e010125rk.html



  c++ 引入虛基類的原因是多繼承產生了二義性。

虛基類的特點:
       虛基類構造函數的參數必須由最新派生出來的類負責初始化(即使不是直接繼承);
       虛基類的構造函數先於非虛基類的構造函數執行

 在類中,如果什麼都沒有,則類佔用1個字節,一旦類中有其他的佔用空間成員,則這1個字節就不在計算之內,如一個類只有一個int則佔用4字節而不是5字節。如果只有成員函數,則還是隻佔用1個字節,因爲類函數不佔用空間。

虛函數因爲存在一個虛函數表,需要4個字節,數據成員對象如果爲指針則爲4字節,注意有字節對齊,如果爲13字節,則進位到16字節空間。






發佈了448 篇原創文章 · 獲贊 3 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章