程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++虛函數和純虛函數(2)

C++虛函數和純虛函數(2)

編輯:C++入門知識

 

本來只想看看書就過了,但是最近在看《設計模式》和《effective C++》這兩本書,其中將到很多關於C++中封裝,繼承和多態的思想,所以不得不做一些筆記。

 

關於虛函數,在多態當中,一定要將基類的析構函數設置為虛函數並將其實現,只有這樣,才能夠達到按對象構造的逆序來析構對象;否則,析構的時候,只會析構基類的那一部分,那麼派生類那一部分就無法成功析構了。

class shape

{

public:

    shape(){};

    virtual void draw() = 0;

    virtual ~shape(){cout << "shape destruction" << endl;}

};

 

class rectangle : public shape

{

public:

    rectangle(){};

    void draw()

    {

 

    }

    ~rectangle(){cout << "rectangle destruction" << endl;}

};

 

class round : public shape

{

public:

    round(){};

    void draw()

    {

 

    }

    ~round(){cout << "round destruction" << endl;}

};

 

void main()

{

    shape * s;

 

?    s = new rectangle();

    s->draw();

    delete s;

 

    s = new round();

    s->draw();

    delete s;

}

 

 

--------------------------------------------------------------------------------

 

 §純虛函數

 

在虛函數的中舉了shape的例子,裡面有個draw函數,但是如果具體去實現的話,draw shape?這實現起來很模糊,如果將shape基類實例化的話,就搞不清draw什麼了(畫出亂七八糟的東西,這不是客戶需要的東西,客戶需要的是具體的圖形)。因此有必要在基類shape當中,將draw的定義(實現)除去,而將它的定義(實現)留給派生類。

 

?class shape

{

public:

    shape(){};

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

};

  

class rectangle : public shape

{

public:

    rectangle(){};

    void draw()

    {

        畫方形;

    }

};

  

class round : public shape

{

public:

    round(){};

    void draw()

    {

        畫圓形;

    }

};

  

void main()

{

    shape * s;

  

    s = new rectangle();

    s->draw();

  

    s = new round();

    s->draw();

}   

 

作者 搗亂小子

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved