虛擬函式 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