從C到C++(下)
繼承
從一個類派生到另外一個類,使前者的所有特征在後者中自己主動可用。
他能夠聲明一些類型,這些類型能夠共享部分或所有曾經所聲明的類型。它也能夠從超過一個的基類中共享一些特性。
C++是支持多繼承的。
類的繼承修飾符後:
使用private繼承,父類的全部方法在子類中變為private;
使用protected繼承,父類的protected和public方法在子類中變為protected,private方法不變;
使用public繼承,父類中的方法屬性不發生改變;
public: | protected: | private: | |
public繼承 | public | protected | --- |
protected繼承 | protected | protected | --- |
private繼承 | private | private | --- |
class Fruit{ public: peel(); slice(); juice(); private: int weight; int height; }; class Apple : public Fruit { public: void make_candy_apple(float weight); void bob_fro(int tub_id, int num_of_attempts); }
類的嵌套並不具有特殊的權限。跟被嵌套的類也沒有什麽特殊的關系。
嵌套通常被用於實現容器類(實現一些數據結構的類,如鏈表、隊列等)。
C++添加了模板(template)被用於實現容器類。
繼承表示一個對象是一個更為普通的父對象的特型。
—————————————————————————————————————————————————————————————————————————————
多重繼承
多重繼承同意把兩個類組合成一個。這樣結果類對象的行為類似於這兩個類的對象中的不論什麽一個。
它把樹形類體系變成格形。
—————————————————————————————————————————————————————————————————————————————
多態——執行時綁定
多態,支持相關的對象具有不同的成員函數(但原型同樣),同意對象與適當的成員函數進行執行時綁定。C++通過覆蓋支持這樣的機制——全部的多態成員函數具有同樣的名字,由執行時系統推斷哪一個最為合適。
當使用繼承時就要用到這樣的機制:有時你無法在編譯時分辨所擁有的對象究竟是基類對象還是派生類對象。這個推斷並調用正確的函數的過程就被稱為“後期綁定”。在成員函數加virtualkeyword告訴編譯器該成員函數是多態的。
在平常的編譯時重載中,函數的原型必須顯著不同。這樣編譯器才幹通過查看擦輸的類型來推斷須要調用那個函數;但在虛擬函數中。函數的原型必須同樣,有執行時系統進行解析調用哪一個函數。這樣的過程叫覆蓋。
重載是發生在同一類的不同函數間。覆蓋是發生在多個類繼承中。
多態就是指一個函數函數或操作符僅僅有一個名字,但它能夠用於幾個不同的派生類型的能力。
每一個對象都實現該操作的一種變型,表現一種最適合自身的行為。它始於覆蓋一個名字,對同一名字進行復用,使它能夠表現出不同的行為。
—————————————————————————————————————————————————————————————————————————————
C++純虛函數
一、定義
純虛函數是在基類中聲明的虛函數。它在基類中未定義,但要求不論什麽派生類都要定義自己的實現方法。在基類中實現純虛函數的方法是在函數原型後加“=0”
virtual void funtion()=0
二、引入原因
1、為了方便使用多態特性。我們經常須要在基類中定義虛擬函數。
2、在非常多情況下,基類本身生成對象是不合情理的。比如,動物作為一個基類能夠派生出老虎、孔雀等子類。但動物本身生成對象明顯不合常理。
為了解決上述問題,引入了純虛函數的概念,將函數定義為純虛函數(方法:virtual ReturnType Function()= 0;)。則編譯器要求在派生類中必須予以重寫以實現多態性。
同一時候含有純虛擬函數的類稱為抽象類。它不能生成對象。這樣就非常好地攻克了上述兩個問題
從C到C++(下)