1. 程式人生 > >虛擬函式 virtual function 筆記(與繼承)----C++學習之路

虛擬函式 virtual function 筆記(與繼承)----C++學習之路

  1.虛擬函式的概念

在語法上,只要在成員函式前加上virtual,例如:virtual void draw() const =0;

所謂繼承其實就是繼承函式的呼叫權。子類可以呼叫父函式的函式。

但是當我們子類要去修改這個函式,則要用到虛擬函式。

  2.虛擬函式的分類:

(1):non-virtual:你不希望derived class overide(重寫)。 int objectID() const; 

(2):virtual函式:你希望derived class去重新override。並且父類有預設的定義。 virtual void erro (const std::string& msg);

(3):pure virtual(純虛擬函式):你希望derived class一定要去重新override它,它對於子類沒有預設定義。virtual void draw(0 const = 0;

  3.關於繼承與虛擬函式的例子:

class Shape
{
public:
    virtual void draw() const =0;
    virtual void error(const std::sting& msg);
    int objectID()const;
    ...
};

class Rectangle: public Shape{....};
class Ellopse:public Shape{....};
這個父類是一個很抽象的“形狀”

子類可以是橢圓也可以是矩形。

不管你是橢圓還是矩形,我都給你一個ID,不需要子類去更改它,那就設定成non-virtual。

當子類操作失敗之後,我希望丟出一個錯誤程式碼,讓子類去設定錯誤程式碼,那就允許子類去override這個error。

draw繪製,因為子類有不同的形狀,所以只能讓子類去定義,所以設定成pure-virtual。

  4.繼承與虛擬函式的案例

Teplate Method 設計模式


也就是MFC中的一段,利用Template Method,利用虛擬函式與繼承。

  5.為什麼會像圖中一樣跑過去?

因為在編譯器中是這樣的,也就是myDoc作為this point傳入

OnFileOpen中,也就是this->Serilize().


  7.複合與繼承條件下的ctor detor