多態分為兩類:
1.靜態多態:函數重載 和 運算符重載屬于靜態多態,復用函數名
2.動態多態:派生類和虛函數實現運行時多態
靜態多態與動態多態的區別:
1.靜態多態的函數地址早綁定 - 編譯階段確定函數地址
2.動態多態的函數地址晚綁定 - 運行階段確定函數地址
#include <iostream> using namespace std; // 多態 // 動物類 class Animal { public: virtual void speak() { cout << "動物會叫" << endl; } }; class Dog: public Animal { // Animal &animal = dog; 是允許的 public: void speak() { cout << "狗:汪汪" << endl; } }; void Speak(Animal &animal) { animal.speak(); } void test() { Dog dog; Speak(dog); } int main() { Dog dog; Speak(dog); // 由于函數早綁定,在編譯階段就確定了函數地址,所以輸出結果為 動物會叫 // 如果想執行Dog,那么這個函數地址應該晚綁定,在 Animal 中的 speak 前加 virtul 關鍵字 // 添加 virtual 后,輸出結果為 狗:汪汪 return 0; } /* 動態多態滿足條件 1.有繼承關系 2.子類要重寫父類中的虛函數,重寫時可以不寫 virtual 關鍵字 重寫:函數返回值類型,函數名,參數列表,完全相同 動態多態的使用: 父類的指針或者引用執行子類對象 e.g Animal &animal = dog; */
指針只占用四個字節的空間
多態的優點:
代碼組織結構清晰;可讀性強;利于前期和后期的擴展和維護
在多態中,父類中的虛函數一般是無意義的,主要都是調用子類重寫的內容,因此我們可以將虛函數改寫為純虛函數
virtual 返回值類型 函數名(參數列表) = 0;
當類中有了純虛函數,那么這個類就被稱為抽象類
抽象類特點
1.無法實例化對象 2.子類必須重寫抽象類中的虛函數,否則也屬于抽象類
浙公網安備 33010602011771號