-
函數重寫回顧
-
父類中被重寫的函數依然會繼承給子類
-
子類中重寫的函數將覆蓋父類中的函數
-
通過作用域分辨符(::)可以訪問父類中的函數
Chidl c; Parent*p = &c; c.Parent::print(); //在父類中繼承 c.print(); //在子類中重寫 p->print(); //父類中定義
-
面向對象中期望的行為?
根據實際的對象類型判斷如何調用重寫函數,父類指針(引用)指向父類對象則調用父類中定義的函數,如果指向子類對象則調用子類中定義的重寫函數。
-
面向對象中多態的概念?
根據實際的對象類型決定函數調用的具體目標,同樣的語句在實際運行時有多重不同的表現形態
-
C++語言支持多態的概念
-
通過使用virtual關鍵字對多態進行支持
-
被virtual聲明的函數被重寫后具有多態特性
-
被virtual聲明的函數叫做虛函數
-
實驗
#include <iostream> #include <string> using namespace std; class Parent { public: virtual void printf() { cout << "I'm Parent" << endl; } }; class Child :public Parent { public: void printf() { cout << "I'm Child" << endl; } }; void How_to_printf(Parent*p) { p->printf(); } int main() { Child c; Parent p; How_to_printf(&c); How_to_printf(&p); }
-
運行結果
I'm Child I'm Parent
-
多態的意義
-
在程序運行過程中展現出動態的特性
-
函數重寫必須多態實現,否則沒有意義
-
多態是面向對象組件化程序設計的基礎特性
-
理論中的概念
-
靜態聯編:在程序的編譯期間就能確定具體的函數調用,如函數重載。
-
動態聯編:在程序實際運行后才能確定具體的函數調用,如函數重寫。
-
小結
-
函數重寫只可能發生在父類和子類之間
-
根據實際對象的類型確定調用具體的函數
-
virtual關鍵字是C++中支持多態的唯一方式
-
被重寫的虛函數可以表現出多態的特性