什麼是多型呢?
字面意思就是同一事物有多種形態。
在物件導向程式設計中,多型指的是介面的多種不同的實現方式。程式設計其實就是乙個將具體世界進行抽象化的過程,多型就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的物件發出相同的訊息將會有不同的行為。
那麼多型又分為靜態多型和動態多型。
靜態多型:靜態型別,物件宣告時的型別,在編譯期間就確定下來了,實現方式有:函式過載,泛型程式設計。
動態多型:動態型別,目前所指物件型別,在程式執行期間所呼叫的型別。實現方式有:虛函式。
動態多型產生的條件:
1:在繼承體系下,基類必須要有虛函式,派生類中必須要對基類的虛函式進行重寫(函式原型必須一模一樣)。
2:通過基類的指標或者引用來呼叫。
協變:重寫基類虛函式時返回值為基類/派生類的指標或者引用
多型的作用:
1. 應用程式不必為每乙個派生類編寫功能呼叫,只需要對抽象基類進行處理即可。大大提高程式的可復用性。//繼承
2. 派生類的功能可以被基類的方法或引用變數所呼叫,這叫向後相容,可以提高可擴充性和可維護性。 //多型的真正作用,以前需要用switch實現
多型的使用:
多型允許將子類的物件當作父類的物件使用,某父型別的引用指向其子型別的物件,呼叫的方法是該子型別的方法。這裡引用和呼叫方法的**編譯前就已經決定了,而引用所指向的物件可以在執行期間動態繫結。
通過例子看多型的實現:
#include
using
namespace
std;
//靜態多型
int add(int left, int right)
float add(float left, float right)
int main()
//靜態多型:編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別轉換),可推斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。
【動態多型】
動態繫結:在程式執行期間(非編譯期)判斷所引用物件的實際型別,根據其實際型別呼叫相應的方法。
使用virtual關鍵字修飾類的成員函式時,指明該函式為虛函式,派生類需要重新實現,編譯器將實現動態繫結。
【動態繫結條件】
1、必須是虛函式
2、通過基類型別的引用或者指標呼叫虛函式
【純虛函式】
在成員函式的形參列表後面寫上=0,則成員函式為純虛函式。包含純虛函式的類叫做抽象類(也叫介面類),抽象類不能例項化出物件。純虛函式在派生類中重新定義以後,派生類才能例項化出物件。
class person
;class student : public person
{};
總結:
1、派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值完全相同。(協變除外)
2、基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性。
3、只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義為虛函式。
4、如果在類外定義虛函式,只能在宣告函式時加virtual關鍵字,定義時不用加。
5、建構函式不能定義為虛函式,雖然可以將operator=定義為虛函式,但最好不要這麼做,使用時容易混淆
6、不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會出現未定義的行為。
7、最好將基類的析構函式宣告為虛函式。(析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但是構成覆蓋,這裡編譯器做了特殊理)
8、虛表是所有類物件例項共用的
【虛表剖析】
什麼是虛表呢?
類的物件裡面有虛函式那麼在類物件模型中前四個位元組存放的就是虛表指標!
//class ctest
////private:
// int itest;
//};
//int main()
//class ctest
virtual ~ctest() {};
private:
int itest;
};int main()
【沒有覆蓋的情況下】
1:虛函式按照其宣告的順序存在於虛表中
2:在派生類中,前面是基類的虛函式,後面是派生類中虛函式
【有覆蓋的情況下】
通過基類的引用或者指標呼叫虛函式,呼叫基類還是派生類的虛函式,要根據執行時根據引用(指標)實際引用(指向)的型別確定呼叫非虛函式,則無論基類指向的是何種型別,都呼叫的是基類的函式。
派生類虛函式表的生成:
1:先拷貝基類的虛函式表
2:如果派生類重寫了基類的某個虛函式,就覆蓋同位置的基類虛函式
3:跟上派生類自己新定義的虛函式
物件導向 多型
繼承是多型的基礎,是指物件的多種形態 1.引用的多型 1 父類的引用可以指向本類的物件 2 父類的引用可以指向子類的物件 注意 子類的引用不能指向父類的物件 2.方法的多型 1 建立本類物件時,呼叫的方法是本類的方法 2 建立子類物件時,呼叫的方法是子類重寫的方法或是繼承的方法 注意 如果是子類獨有...
物件導向 多型
多型可以簡單的概括為 乙個介面,多種方法 在程式執行過程中才決定呼叫的函式,簡單的說就是,允許將子類型別的指標賦值給父類型別的指標,賦值後,父類物件就可以根據當前賦給它的子類物件的特徵以不同的方式執行。容易混淆的兩個概念 是指允許存在多個同名的函式,而這些函式的參數列不同 或許引數個數不同,或許引數...
物件導向 多型
多型 可以理解為事物存在的多種體現形態。人 男人,女人 動物 貓,狗。貓 x new 貓 動物 x new 貓 1,多型的體現 父類的引用指向了自己的子類物件。父類的引用也可以接收自己的子類物件。2,多型的前提 必須是類與類之間有關係。要麼繼承,要麼實現。通常還有乙個前提 存在覆蓋。3,多型的好處 ...