C 物件導向之多型

2021-07-30 07:39:58 字數 3310 閱讀 5312

物件的型別:

多型:

在c++語言中,基類將型別相關的函式與派生類不做改變直接繼承的函式區分對待,對於某些函式,基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式。

c++的多型性:

物件導向(oop)的核心思想是多型性(polymorphism)。多型這個詞源於希臘語,含義為「多種形式」,我們把 具有繼承關係的多個型別成為多型型別。因為我們能使用這些型別的「多種形式」而無需在意它們的差異。引用或指標的靜態型別與動態型別不同這一事實正是c++語言支援多型性的根本所在。當我們使用基類的引用或指標呼叫基類中定義的乙個函式時,我們並不知道該函式真正作用的物件是什麼型別,因為它可能是乙個基類的物件也有可能是乙個派生類的物件。如果該函式是虛函式,則直到執行時才會決定到底執行哪個版本,判定的依據是引用或指標所繫結的物件的真實型別。

另一方面,對非虛函式的呼叫是在編譯時進行繫結。類似的,通過物件進行的函式呼叫也在編譯時繫結。物件的型別是確定不變的,我們無論如何都不可能令物件的動態型別與靜態型別不一致,因此,通過物件進行的函式呼叫將在編譯時繫結到該物件所屬類的函式版本上。

1.靜態多型

靜態鏈編或早繫結:編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別轉換),可推斷出要呼叫哪個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。

2.動態多型

動態鏈編或晚繫結:在程式執行期間(非編譯期)判斷所引用物件的實際型別,根據其實際型別調相應的方法。

使用virtual關鍵字修飾類的成員函式時,指明該函式為虛函式,派生類需要重新實現,編譯器將實現動態繫結。

動態繫結的條件:(1)必須是虛函式(任何建構函式之外的非靜態函式都可以是虛函式)

(2)通過基類型別的引用或者指標呼叫函式

#include #include #include using namespace std;

class cbase

void funtest2(int _itest)

virtual void funtest3(int _itest1)

virtual void funtest4( int _itest)

};class cderived :public cbase

virtual void funtest2(int _itest)

void funtest3(int _itest1)

virtual void funtest4(int _itest1,int _itest2)

執行結果:

如果派生類的函式與基類同名,但是引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏。

如果派生類的函式與基類同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式將被隱藏。

派生類重寫了基類中的虛函式,則派生類物件的虛表會替換基類中的虛函式,即基類的虛函式被派生類重寫的虛函式覆蓋了。

派生類先拷貝基類的虛表,若派生類沒有重寫虛函式,則虛表與基類的相同,若重寫了虛函式,則派生類會將基類相同位置上的虛函式覆蓋,再在虛表後面加上派生類自己的虛函式。(基類和派生類用的不是一張虛表)

3.純虛函式:在成員引數的形參後面寫上=0,則成員函式為純虛函式。包含純虛函式的類叫做抽象類(介面類),抽象類不能例項化出物件。純虛函式在派生類中重新定義以後,派生類才能例項化出物件。

迴避虛函式的機制:在某些情況下,我們希望對虛函式的呼叫不要進行動態繫結,而是強迫其執行虛函式的某個特定版本,使用作用域限定符可以實現這一目的。

如果乙個派生類虛函式需要呼叫它的基類版本,但是沒有使用作用域限定符,則在執行時該呼叫將被解析為對派生類版本自身的呼叫,從而導致無限遞迴。

總結:

1、派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值完全相同。(協變除外)(協變是指當類的虛   函式返回型別是類本身的指標或引用)

2、基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性。

3、只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義為虛函式。

4、如果在類外定義虛函式,只能在宣告函式時加virtual關鍵字,定義時不用加。

5、建構函式不能定義為虛函式,雖然可以將operator=定義為虛函式,但最好不要這麼做,使用時容易混淆

6、不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會出現未定義的行為。

7、最好將基類的析構函式宣告為虛函式。(析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但是構成覆蓋,這裡編譯器做了特殊處理)

8、虛表是所有類物件例項共用的虛表剖析,對於有虛函式的類,編譯器都會維護一張虛表,物件的前四個位元組就是指向虛表的指標

虛表指標(虛函式的呼叫):

物件導向之多型

多型即事物存在的多種形態 要有繼承 要有方法重寫 要有父類引用指向子類物件 1,多型中的成員訪問特點之成員變數 編譯看左邊 父類 執行看左邊 父類 2,多型中的成員訪問特點之成員方法 編譯看左邊 父類 執行看右邊 子類 3,多型中的成員訪問特點之靜態成員方法 編譯看左邊 父類 執行看左邊 父類 總結...

物件導向之多型

多型指的是一類事物有多種形態,多型性是指在不考慮例項型別的情況下使用例項 class animals def run self print running class dog animals def run self print dog is running class pig animals de...

物件導向之多型

多型指的是一類事物有多種形態 動物有多種形態 人,狗,豬 import abc class animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod deftalk self pass class people animal 動物的形態之一 人...