子類繼承父類的虛函式呼叫

2021-07-11 06:16:39 字數 1862 閱讀 3807

父類:father

子類:son

1.  father* fa=new son()

例項1:

#includeusing namespace std;

class father

void watchtv()

virtual void say()

};class son :public father

void watchtv()

void say()

};int main()

執行結果:

結果分析:

1.首先執行** father* fa=new son();,會首先呼叫父類建構函式,再呼叫子類建構函式,所以第

一、第二行如圖所示;

2.執行**fa->watchtv(),根據fa的型別,因為是father型別的,所以會先檢視father類中的watchtv函式,因為不是虛函式,所以直接呼叫,結果如第三行所示;

3.執行**fa->say(),根據fa的型別,因為是father型別的,所以先檢視father類中的say函式,因為是虛函式,所以會檢視虛函式表,檢視實現例項,找到子類son有實現虛函式say,所以會呼叫子類son的say函式,結果如第四行所示。

例項2: 在建構函式中呼叫虛函式

#include#includeusing namespace std;

class father

virtual void watchtv()

執行結果:

結果分析:

1.執行**father* fa=new son(),會先呼叫父類建構函式,父類建構函式中會執行以下操作:a)首先給變數val賦值為「hunantv",其次,呼叫函式say(),此時會輸出前兩行內容;b)因為say()函式會呼叫虛函式watchtv(),而且在子類中有watchtv的例項實現,但是根據輸出結果第三行發現,呼叫的還是父類的虛函式,為什麼呢?因為,父類建構函式中呼叫虛函式,表現的虛函式為父類的虛函式,所以結果為第三行的顯示;c)父類構造函式呼叫完後,執行子類建構函式,因為子類沒有定義say()函式,所以呼叫繼承自父類的say()函式,所以輸出結果為第

四、第五行;d)say函式呼叫虛函式watchtv(),因為是在子類son的建構函式中呼叫虛函式,所以呼叫的是子類的watchtv,所以輸出結果如第六行所示;e)執行完子類構建後,執行fa->say();,首先看fa的型別,所以呼叫父類的say(),say()呼叫虛函式watchtv時,因為watchtv在子類中有例項實現,所以會呼叫子類的watchtv,所以輸出結果如第

七、第八行所示。

總結:

1.當在建構函式中呼叫虛函式時,虛函式表現為該類中虛函式的行為,即父類構造函式呼叫虛函式,則虛函式為父類中的虛函式;子類建構函式中呼叫虛函式,則呼叫的是子類中的虛函式;

2.如果不是在建構函式中呼叫虛函式,則會首先檢視虛函式表,如果有例項實現,則呼叫例項。比如:父類中有虛函式watchtv,則呼叫父類中watchtv時,則因為子類實現了watchtv,則呼叫子類的watchtv。

Java 子類繼承父類呼叫順序

建立子類後的呼叫順序 構造器呼叫順序 多型this.method o super.method o this.method super o super.method super o 注意 如果某個方法是靜態的,那麼這個方法就不具有多型性。class a a public void fun publi...

虛函式與非虛函式在父類 子類之間的呼叫

include using namespace std class a 輸出結果 1 在建立子類呼叫子類的建構函式之前,會先呼叫父類的建構函式 2 virtual跟多型有關,加了virtual關鍵字的函式,在呼叫的時候 如果子類有 就先呼叫子類的,如果子類沒有 就呼叫父類的 3 父類指標指向子類物件...

解釋虛函式的例子(父類子類指標函式呼叫注意事項)

父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...