結合9.20日所學的繼承,多重繼承及指針等相關知識,對多態及虛函數進行學習,主要練習為圖形類的多態、虛函數的實際應用。
多態性:
1.多態性的概念:
多態性是面向對象程序設計的第三個重要特征。
多態性是指發出同樣的消息被不同類型的對象接收時導致完全不同的行為。
消息——主要指對類的成員函數的調用。
多態的實現:
函數重載
運算符重載
虛函數
2 運算符重載:
C++運算符重載的實質:
運算符重載的實質就是函數重載或函數多態。運算符重載是一種形式的C++多態。目的在于讓人能夠用同名的函數來完成不同的基本操作。要重載運算符,需要使用被稱為運算符函數的特殊函數形式,運算符函數形式:
函數類型?operator?運算符(形參表)??{????? ? 函數體;??}
*補充:c++中別名&*:
int n;
int &m = n;
在C++中,多了一個C語言沒有的引用聲明符&,如上,m就是n的引用,簡單的說m就是n的別名,兩者在內存中占同樣的位置,不對m開辟新的內存空間,對m的任何操作,對n來說是一樣的。
對于引用,有以下三條規則:
(1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化);
(2)不能有NULL 引用,引用必須與合法的存儲單元關聯(指針則可以是NULL);
(3)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)。
3.靜態聯編與動態聯編:
聯編:
程序自身彼此關聯的過程,確定程序中的操作調用與執行該操作的代碼間的關系。
靜態聯編(靜態束定)
聯編工作出現在編譯階段,用對象名或者類名來限定要調用的函數。
動態聯編
聯編工作在程序運行時執行,在程序運行時才確定將要調用的函數。
**4.? 虛函數**
(1)虛函數是動態聯編的基礎。
是非靜態的成員函數。
在類的聲明中,在函數原型之前寫virtual。
virtual 只用來說明類聲明中的原型,不能用在函數實現時。
具有繼承性,基類中聲明了虛函數,派生類中無論是否說明,同原型函數都自動為虛函數。
(2)本質:不是重載聲明而是覆蓋。
調用方式:通過基類指針或引用,執行時會?根據指針指向的對象的類,決定調用哪個函數。
(3)在基類的成員函數前加virtual關鍵字表示這個函數是一個虛函數
所謂虛函數就是在編譯的時候不確定要調用哪個函數,而是動態決定將要調 用哪個函數
要實現虛函數必須派生類的函數名與基類相同,參數名參數類型等也要與基類相同。但派生類中的virtual關鍵字可以省略,也表 示這是一個虛函數。
一般使用時聲明一個基類的指針(必須是基類,反之則不行)p,把p指向派生類的對象實例,調用虛函數,這 時系統會判斷p所指向的實例的類型,如果是A類的實例就調用A類的同名函數執行,如果是B類的實例就調用B類的同名函數。
(4)一個函數一旦被說明為虛函數
則無論說明它的類被繼承了多少層,在每一層派生類中該函數都保持virtual特性。因此,在派生類中重新定義該函數時,不再需要關鍵字virtual。
但習慣上,為了提高程序的可讀性,常常在每層派生類中都重復地使用virtual關鍵字。