c 純虛函式

2021-06-01 21:21:13 字數 1010 閱讀 1751

一、抽象基類和純虛函式

在設計時,常常希望基類僅僅作為其派生類的乙個介面,也就是說,僅想對基類進行向上型別轉換,使用它的介面,而不希望使用者建立乙個基類的物件。要做到這一點,可以在基類中加入至少乙個純虛函式,來使基類成為抽象類,如果某人試著生成乙個抽象類的物件,編譯器會制止他。另外,當繼承乙個抽象類時,必須實現所有的純虛函式,否則繼承出的類也將是抽象類。

建立公共介面的唯一原因是它能對於每個不同的子類有不同的表示。它建立乙個基本的格式,用來確定什麼是對於所有的派生類是公共的——除此之外,別無用途。

當實現繼承和重新定義一些虛函式時,編譯器為新類建立乙個新的vtable表,並且插入新函式的位址,對於沒有重新定義的虛函式使用基類函式的位址,無論如何,對於可被建立的每乙個物件(即它的類中不含有純虛函式),在vtable中總有乙個函式位址的全集,所以絕對不能對不在其中的位址進行呼叫(否則結果將會是災難的)。

二、不能建立乙個抽象類的物件

假設我們在乙個類中加入乙個純虛函式,則這個類成為抽象類,如按照以下宣告:

virtualvoid f() = 0

這樣做,等於告訴編譯器在vtable中為函式保留乙個位置,但是在這個位置中不放位址,如果有乙個函式在類中被宣告為純虛函式,則vtable就是不完全的。而如果乙個類的vtable是不完全的,當某人試圖建立這個類的物件時,編譯器就會發出乙個錯誤資訊,這樣,編譯器就保證了抽象類的純潔性,它就不會被誤用了。

當多型地處理物件時,傳位址和傳值有明顯的不同。大部分的都是傳位址的,這是因為位址都有相同的長度,傳遞派生類物件的位址和傳遞基類的位址是相同的,這是使用多型的目的,即讓對基類物件操作的**也能透明地操作派生類物件。

如果對乙個物件進行向上型別轉換,而不使用位址或引用,這個物件將會被「切片」,直到剩下來的是適合於目的的子物件。「切片」,實際上是當它拷貝(因為不是傳位址或引用)

到乙個新的物件時,去掉原來物件的一部分,而不是像使用指標或引用那樣簡單地改變位址的內容。純虛函式的應用則會通過乙個編譯錯誤來防止物件切片,因為抽象類物件是不能建立的。

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...

C 虛函式 純虛函式

1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...

C 虛函式 純虛函式

include qdebug class animal void animal animal 即要實現基類animal的animal函式 假如在dog子類中沒有實現animal 函式,則會呼叫基類的animal 函式。即列印 what is the animal 假如在dog子類中實現了animal...