cpp 多型性,抽象基類

2021-08-29 02:19:25 字數 1603 閱讀 9972

多型性是oop的乙個重要特徵,也就是所謂的乙個名字多個實現。

多型性分兩類:

靜態多型性:函式過載和運算子過載實現的多型性屬於靜態,又稱為編譯時的多型性

動態多型性:在程式執行過程中才動態確認操作所針對的物件,又稱為執行時多型性,通過虛函式實現

虛函式在同一類中是不能定義兩個名字相同,引數個數和型別都相同的函式的。但是在類的繼承中,是可以出現名字相同,引數個數和型別都相同的函式。只要通過不同類的命名域區分即可。a.x::function(), a.b::function()

虛函式允許通過基類指標或引用來訪問基本和派生類中的同名函式,也就是通過指標呼叫同名函式,而不是通過物件名。

形式:在最左邊加上關鍵字:virtual

class student

class graduate:public stdent

int main()

上述程式中,沒有將display設定為虛函式,因此將pt指向grad1並呼叫display時,只會呼叫基類的display函式,這是因為當指向grad1派生類時,進行指標型別轉換,將派生類物件的指標先轉換為基類的指標,因此基類指標指向的是派生類物件中的基類部分。

而如果在student類中的display函式前加上virtual,那麼在派生類的基類部分中,派生類的虛函式取代了基類原來的虛函式。

虛函式的使用方法:

1.在基類中用virtual宣告成員函式為虛函式

2.在派生類中重新定義此函式,要求函式名,函式型別,函式引數個數和型別都要完全一樣。

當基類的成員函式宣告為虛函式時,派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual也可以不加,一般要加,保證可讀性。

3.定義乙個指向基類物件的指標變數,通過指標呼叫虛函式。

通過虛函式和指向基類物件的指標變數的配合使用,能方便呼叫同一類族不同類物件的同名函式。

虛析構函式

析構函式的作用是進行清理工作,派生類的物件撤銷時先呼叫派生類的析構函式,再呼叫基類的析構函式,但是如果用new運算子建立了臨時物件,用乙個基類的指標刪除乙個派生類的物件,若基類中有析構函式,並定義乙個指向該基類的指標變數,那麼當用delete撤銷物件時,系統只執行基類的析構函式,並不執行派生類的析構函式。

因此一般而言,對於基類都宣告析構函式為虛函式,來保證派生類的析構函式能夠被呼叫。

建構函式不能宣告為虛函式。因為在執行建構函式時類物件還未完成建立過程,當然談不上函式與類物件的blinding,也就是繫結。具體原因如下:

1.構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道物件 的實際型別

2.虛函式的執行依賴於虛函式表。而虛函式表在建構函式中進行初始化工作,即初始化vptr,讓他指向正確的虛函式表。而在構造物件期間,虛函式表還沒有被初 始化,將無法進行。

純虛函式

基類並不用,只是考慮到派生類會用到,因此可以將基類的虛函式宣告為純虛函式

virtual float function() = 0;

注意:1純虛函式沒有函式體

2.這是個宣告語句,最後應該有分號。

抽象基類

含有純虛函式的類就是抽象基類,抽象基類負責定義介面。並且我們不能建立抽象基類的物件。

C 多型性 (多型性)虛方法 抽象類

多型性 虛方法 1 在父類的方法中加入virtual,這個方法可以被子類重新寫一遍。在子類的方法前加入override 多型就是指不同的物件收到相同的訊息,會產生不同的行為,同乙個類在不同的場合下表現出不同的行為特徵 多型的作用 把不同的子類都看作是父類,可以遮蔽到不同子類物件之間的差異,寫出通用的...

多型性 虛函式 抽象類

一 多型性 指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c 支援兩種多型性 編譯時多型性,執行時多型性。1.編譯時多型性 通過過載函式實現 2.執行時多型性 通過虛函式實現。二 虛函式 虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式。可實現成員函式的動態...

虛方法,抽象類,多型性

code 1.虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。如 抽象方法 public abstract class animal 虛方法 public class animal public virtual void eat 2 抽象...