標籤:
主要內容:
1.多態性
2.運算子多載
3.虛函數
4.純虛函數
5.抽象類別
多態實現:
--函數重載
--運算子多載
--虛函數
限制:有些運算子是不可重載的,重載基本是改變操作對象,有基本類型轉為user-defined類型。
實現機制:運算運算式==》運算子函數,運算對象==》運算子函數的實參
形式:1.重載為類成員函數,此時 參數個數=原運算元-1(後置++,--除外)
2.重載為友元函數,此時 參數個數 = 原運算元個數,至少有一個使用者自訂類型的形參。
聲明形式:
函數類型 operator 運算子(形參)
{
.....
}
運算子成員函數的設計:
1.雙目運算子B
oprd1 B oprd2
若oprd1 是A類對象 則 oprd1 B oprd2 ==>> oprd1.operator B(oprd2)
2.前置單目運算子U
U oprd
若oprd 為A類對象 ,U 被重載為A類的成員函數 則U oprd ==>> oprd.operator U()
3.後置單目運算子++、--
oprd++ / oprd--
若oprd為A類對象,++、--被重載為A類的成員函數,且具有一個int類型形參。則 oprd++ ==> oprd.operator++(0)
為何要這樣設計呢???如果不明白,雖然現在看懂了,過後還是忘得?????
運算子友元函數設計:
1.雙目運算子B
oprd1 B oprd2 ===> operator B(oprd1,oprd2)
2.前置單目運算子B
B oprd ===>operator B(oprd)
3.後置單目運算子++、--
oprd B ===>operator B(oprd,0)
靜態繫結與動態綁定
1.綁定: 程式自身彼此關聯的過程,確定程式中的操作調用與執行該操作的代碼間的關係。
2.靜態繫結(靜態聯編)
編譯階段,用對象名或者類名來限定要調用的函數
3.動態綁定
運行階段,程式運行時確定將要調用的函數
還是不太明白靜態編譯和動態編譯的概念,到底是如何?動態編譯呢?????
虛函數:
本質:不是重載聲明而是覆蓋
調用方式:根據指標指向的對象的類,而不是指標本身的類型。
虛解構函式:
虛技術與解構函式的合體,這樣可以用基類指標delete衍生類別得對象。
抽象類別
只要含有純虛函數的類就是抽象類別
class 類名
{
virtual 類型 函數名(參數表)=0;/純虛函數
}
NOTE:
抽象類別只能作為基類來使用
不能聲明抽象類別的對象
建構函式能是虛函數,解構函式可以是虛函數(????)
還有一個疑問:為何建構函式不具有繼承特性呢。解構函式呢?解構函式也不具有繼承特性。但可以有虛解構函式
第八章:多態性