Virtual以及虛解構函式

來源:互聯網
上載者:User

標籤:des   style   blog   http   java   使用   os   ar   

Typedef int (*healthcalcfunc)(const gamecharacter&)

 

當一個成員函數被聲明為虛函數後,其衍生類別中的同名函數都自動成為虛函數。因此,在子類從新聲明該虛函數時,可以加,也可以不加,但習慣上每一層聲明函數時都加virtual,使程式更加清晰。

 

友元函數 建構函式 static靜態函數 不能用virtual關鍵字修飾;

普通成員函數 和解構函式 可以用virtual關鍵字修飾;

 

virtual函數的效果

即用基類指標指向繼承類對象,接著便可以用該指標使用繼承類的成員函數。

 

class Base
{
public:Base(){}
public:
       virtual void print(){cout<<"Base";}//可以不為空白
};

class Derived:public Base
{
public:Derived(){}
public:
       void print(){cout<<"Derived";}
};

int main()
{
       Base *point=new Derived();
       point->print();
}

Output:
Derived 

 

 

虛解構函式的作用:

用C++開發的時候,用來做基類的類的解構函式一般都是虛函數。可是,為什麼要這樣做呢

 

class ClxBase

{

public:

    ClxBase() {};

    virtual ~ClxBase() {};

 

    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };

};

 

class ClxDerived : public ClxBase

{

public:

    ClxDerived() {};

    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

 

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };

};

    代碼

 

ClxBase *pTest = new ClxDerived;

pTest->DoSomething();

delete pTest;

    的輸出結果是:

 

Do something in class ClxDerived!

Output from the destructor of class ClxDerived!

    這個很簡單,非常好理解。

    但是,如果把類ClxBase解構函式前的virtual去掉,那輸出結果就是下面的樣子了:

 

Do something in class ClxDerived!

    也就是說,類ClxDerived的解構函式根本沒有被調用!一般情況下類的解構函式裡面都是釋放記憶體資源,而解構函式不被調用的話就會造成記憶體流失。我想所有的C++程式員都知道這樣的危險性。當然,如果在解構函式中做了其他工作的話,那你的所有努力也都是白費力氣。

    所以,文章開頭的那個問題的答案就是--這樣做是為了當用一個基類的指標刪除一個衍生類別的對象時,衍生類別的解構函式會被調用。

當然,並不是要把所有類的解構函式都寫成虛函數。因為當類裡面有虛函數的時候,編譯器會給類添加一個虛函數表,裡面來存放虛函數指標,這樣就會增加類的儲存空間。所以,只有當一個類被用來作為基類的時候,才把解構函式寫成虛函數。

 

 

虛函數和純虛函數

 

virtual void foo1();//虛函數

 

virtual void foo2() = 0;//純虛函數

 

虛函數為了重載和多態的需要,子類中可以重寫也可以不寫基類中的此函數!

 

純虛函數在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函數!

 

引入原因

1、為了方便使用多態特性,我們常常需要在基類中定義虛函數。(這點和虛函數一樣)

2、在很多情況下,基類本身產生對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身產生對象明顯不合常理。

 

帶純虛函數的類叫虛基類,這樣的類也叫抽象類別。這種基類不能直接產生對象,而只有被繼承,並重寫其虛函數後,才能使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.