C++多態性:
1. 定義:
“一個接口,多種方法”,程序在運行時才決定調用的函數。
2. 實現:
C++多態性主要是通過虛函數實現的,虛函數允許子類重寫override(注意和overload的區別,overload是重載,是允許同名函數的表現,這些函數參數列表/類型不同)。
*多態與非多態的實質區別就是函數地址是早綁定還是晚綁定。
*如果函數的調用,在編譯器編譯期間就可以確定函數的調用地址,並生產代碼,是靜態的,就是說地址是早綁定的。
*而如果函數調用的地址不能在編譯器期間確定,需要在運行時才確定,這就屬於晚綁定。
3.目的:
接口重用。封裝可以使得代碼模塊化,繼承可以擴展已存在的代碼,他們的目的都是為了代碼重用。而多態的目的則是為了接口重用。
4.用法:
聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而實現不同的方法。
#include <iostream> #include <string> using namespace std; class Parent { public: virtual void print() // 這個函數可能被繼承的子類重寫,所以加上virtual 關鍵字來修飾它,稱為虛函數,實現多態; { cout << "I'm Parent." << endl; } }; class Child : public Parent { public: void print() // 雖然沒有寫 virtual 關鍵字,但是由於繼承的關系,它就是虛函數;一般工程中沒必要在子類中寫 virtual; { cout << "I'm Child." << endl; } }; void how_to_print(Parent* p) { p->print(); // 希望展現多態行為; } int main() { Parent p; Child c; how_to_print(&p); // 期望打印: I'm Parent. 實際打印:I'm Parent. how_to_print(&c); // 期望打印: I'm Child. 實際打印:I'm Child. return 0; }
多態意義:
1,在程序運行過程中展現出動態的特性;
1,編譯時無法決定究竟調用哪一個版本的實現;
2,函數重寫必須多態實現,否則沒有意義;
1, C++ 后續語言(Java、C#)中,只要是重寫,一定是虛函數,不需要顯示聲明 virtual 關鍵字;
3,多態是面向對象組件化程序設計的基礎特性;
1,后續學習中多態特性會被變着花樣玩兒,特別是設計模式中絕大多數模式都和多態相關;