C 虛函式和多型性

2021-10-01 04:01:53 字數 1268 閱讀 7140

c++為了實現多型性,提供了靜態繫結(早**或者叫做編譯期繫結)和動態繫結(晚**)兩種機制。

靜態繫結中包括:

1、函式過載

2、運算子過載

3、子類繼承父類時,父類中的函式沒有新增virtual關鍵字(非虛函式),父類指標指向子類的位址時,呼叫和父類同名的函式則會預設呼叫父類的同名函式,子類同名函式的不會被呼叫。因為在程式編譯階段,編譯系統自動將基類的同名函式的函式體和父類指標指向的函式名進行了繫結。

虛函式的定義:

virtual 《型別》《函式名》(《引數列表》)

虛函式一定是成員函式,非成員函式是不能定義為虛函式的,並不是所有的成員函式都可以定義為虛函式,比如靜態成員函式和建構函式。析構函式在某些情況下可以定義為虛函式。

虛函式可以定義在類內和類外。

虛函式的作用:

虛函式的目的就是告訴編譯器在編譯的時候先不要進行靜態繫結,等到程式執行的時候再進行選擇。其實這就是動態繫結的機制,動態繫結必須通過虛函式才能實現,沒有虛函式的多型都是靜態繫結。

在類的繼承關係中,不同層次的類中可以出現相同的名字,成員資料和同名的函式。雖然名字相同,但是他們的實現或者代表的意義是不一樣的。因此,如果基類中的成員和子類的成員存在同名的情況,c++編譯系統將採取同名覆蓋的原則來處理因為同名而存在的衝突問題。

虛函式的特徵:

虛函式具有乙個重要的特點就是繼承性。在基類中宣告的虛函式,在子類中函式宣告完全相同的函式為虛函式。宣告該虛函式時可以使用virtual關鍵字,也可以不使用。因為當將基類中的某乙個成員函式宣告為虛函式後,子類中的同名函式自動稱為虛函式。但是建議還是加上virtual關鍵字,因為這樣可以提高程式的可閱讀性。

虛函式的預設引數:

1、當基類指標或者引用呼叫虛函式時,如果基類中的虛函式含有預設值,那麼子類中的虛函式預設值將無效,不起任何作用。

2、如果子類物件直接呼叫虛函式,那麼會直接使用子類中的虛函式預設值。

靜態繫結和動態繫結的區別:

1、靜態繫結是根據編譯時宣告的變數型別,來決定呼叫的是哪個型別的函式。

2、動態繫結是根據執行時實際賦給變數的型別,來決定呼叫的是基類或者是子類的函式。

總結:虛函式是實現動態繫結的重要形式,要想實現動態繫結必須實現虛函式,沒有虛函式參與實現的多型性都不是動態繫結。但是,虛函式不是實現動態繫結的唯一條件,實現動態繫結還與虛函式的訪問方式有關。

只有通過物件的指標或者引用(基類指標的位址指向子類的位址)才能呼叫虛函式實現動態繫結。否則。即使使用了虛函式,如果是通過物件直接呼叫或者通過基類進行呼叫,還是靜態繫結。

C 多型性和虛函式

c 的多型性,我認為就是表達相同方法的函式在不同的類中的表現形式不同 舉個例子,比如 移動這一行為,人是用兩條腿在走路,烏龜是慢慢爬,蛇是爬行,老虎是四條腿在走,魚是在游動 這就是多型性 多型性使不同的物件但是又具有某種共同屬性的物件不但可以在一定程度上共享 還能共享介面。非靜態函式宣告的前面加上v...

c 多型性 虛函式

c 中多型性是指通過用virtual關鍵字來繫結同名同引數的函式,實現在編譯中進行後繫結,即在編譯過程中不繫結類,在執行時與具體的物件進行繫結,這樣就可以動態地與實際聯絡 比如乙個類 animal 有乙個虛函式breath 魚類 fish 也有函式breath 狗類 dog 函式breath 具體呼...

c 多型性 虛函式

虛函式與純虛函式的區別 1 擁有虛函式的類可以宣告物件,但擁有純虛函式的類不可以宣告物件 只能宣告乙個指標,並且不能給其分配記憶體 並且將這個類稱為抽象類 特點 1 虛函式是動態繫結的基礎。2 是非靜態的成員函式。在類的宣告中,在函式原型之前寫virtual。不能宣告為靜態函式 3 virtual ...