C 虛函式與純虛函式的區別

2021-07-04 20:15:50 字數 2163 閱讀 7870

c++虛函式與純虛函式的區別

1. 虛函式和純虛函式可以定義在同乙個類(class)中,含有純虛函式的類被稱為抽象類(abstract class),而只含有虛函式的類(class)不能被稱為抽象類(abstract class)。

2. 虛函式可以被直接使用,也可以被子類(sub class)過載以後以多型的形式呼叫,而純虛函式必須在子類(sub class)中實現該函式才可以使用,因為純虛函式在基類(base class)只有宣告而沒有定義。

3. 虛函式和純虛函式都可以在子類(sub class)中被過載,以多型的形式被呼叫。

4. 虛函式和純虛函式通常存在於抽象基類(abstract base class -abc)之中,被繼承的子類過載,目的是提供乙個統一的介面。

5. 虛函式的定義形式:virtual ()

純虛函式的定義形式:virtual () = 0;

在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結(run-time bind),而且被兩者修飾的函式生命週期(life recycle)也不一樣。

6. 虛函式必須實現,如果不實現,編譯器將報錯,錯誤提示為:

error lnk****: unresolved external symbol "public: virtual void __thiscall

classname::virtualfunctionname(void)"

7. 對於虛函式來說,父類和子類都有各自的版本。由多型方式呼叫的時候動態繫結。

8. 實現了純虛函式的子類,該純虛函式在子類中就變成了虛函式,子類的子類即孫子類可以覆蓋該虛函式,由多型方式呼叫的時候動態繫結。

9.虛函式是c++中用於實現多型(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的函式

10. 多型性指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。

a.編譯時多型性:通過過載函式實現

b 執行時多型性:通過虛函式實現。

11. 如果乙個類中含有純虛函式,那麼任何試圖對該類進行例項化的語句都將導致錯誤的產生,因為抽象基類(abc)是不能被直接呼叫的。必須被子類繼承過載以後,根據要求呼叫其子類的方法。

例子:class basevirtual

void fun3()

void fun4()

}class subvirtual:public basevirtual

void fun2()

void fun4()

}int _tmain(int argc, _tchar* argv)

輸出:subfun1

subfun2

basefun3

basefun4

fun1

,fun2

被覆蓋了,

fun3,fun4依然呼叫的是父類的函式。

關於虛函式的隱藏

#include

class base

void g(float x)

void h(float x)

};

class derived : public base

void g(int x)

void h(float x)

};void main(void)

bp 和dp 指向同一位址,按理說執行結果應該是相同的,而事實上執行結果不同,所以他把原因歸結為c++的隱藏規則,其實這一觀點是錯的。決定bp和dp呼叫函式執行結果的不是他們指向的位址,而是他們的指標型別。「只有在通過基類指標或引用間接指向派生類子型別時多型性才會起作用」(c++ primer 3rd edition)。pb是基類指標,pd是派生類指標,pd的所有函式呼叫都只是呼叫自己的函式,和多型性無關,所以pd的所有函式呼叫的結果都輸出derived::是完全正常的;

pb的函式呼叫如果有virtual則根據多型性呼叫派生類的,如果沒有virtual則是正常的靜態函式呼叫,還是呼叫基類的,所以有virtual的f函式呼叫輸出derived::,其它兩個沒有virtual則還是輸出base::很正常啊,nothing surprise!

所以並沒有所謂的隱藏規則,記住「只有在通過基類指標或引用間接指向派生類子型別時多型性才會起作用」。

C 虛函式與純虛函式的區別

什麼是虛函式?那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。虛函式宣告如下 virtual returntype fun...

C 虛函式與純虛函式的區別

什麼是虛函式?那些被virtual關鍵字修飾的 成員函式 就是虛函式。虛函式的作用,用專業術語來解釋就是實現 多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。虛函式宣告如下 virtual returntype f...

虛函式 與 純虛函式 區別

首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...