預備知識:
c++賦值相容原則:
乙個公有派生類的物件在使用上可以被當做基類的物件,反之則禁止。
派生類的物件可以被賦值給基類物件。
派生類的物件可以初始化基類的引用(指標也一樣)
多型的概念:
1:先期聯編:能夠在編譯時就能夠確定哪個過載的成員函式被呼叫的情況
2:後期聯編(多型性):系統在執行時,能夠根據其引數型別確定呼叫哪個過載的成員函式的情況
多型概念介紹
所謂的多型即用父型別的指標指向子類物件,然後通過父類的指標呼叫實際之類的成員函式,因此父類的指標具有多種形態。多型性可以簡單地概括為「乙個介面,多種方法」,程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。
c++多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。(這裡我覺得要補充,重寫的話可以有兩種,直接重寫成員函式和重寫虛函式,只有重寫了虛函式的才能算作是體現了c++多型性)而過載則是允許有多個同名的函式,而這些函式的引數列表不同,允許引數個數不同,引數型別不同,或者兩者都不同。編譯器會根據這些函式的不同列表,將同名的函式的名稱做修飾,從而生成一些不同名稱的預處理函式,來實現同名函式呼叫時的過載問題。但這並沒有體現多型性。
多型與非多型的實質區別就是函式位址是早繫結還是晚繫結。如果函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並生產**,是靜態的,就是說位址是早繫結的。而如果函式呼叫的位址不能在編譯器期間確定,需要在執行時才確定,這就屬於晚繫結。
那麼多型的作用是什麼呢,封裝可以使得**模組化,繼承可以擴充套件已存在的**,他們的目的都是為了**重用。而多型的目的則是為了介面重用。也就是說,不論傳遞過來的究竟是那個類的物件,函式都能夠通過同乙個介面呼叫到適應各自物件的實現方法。
最常見的用法就是宣告基類的指標,利用該指標指向任意乙個子類物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。如果沒有使用虛函式的話,即沒有
利用c++多型性,則利用基類指標呼叫相應的函式的時候,將總被限制在基類函式本身,而無法呼叫到子類中被重寫過的函式。因為沒有多型性,函式呼叫的位址將是一定的,而固定的位址將始終呼叫到同乙個函式,這就無法實現乙個介面,多種方法的目的了。
多型性的條件:
1:基類的虛函式。
2:派生類的虛函式必須和基類的虛函式宣告一致(包括引數型別,返回值類)
3:類的成員函式才可以說明成虛函式(一般函式不行)。靜態成員函式不受制於某個物件,不能說明成虛函式。內聯函式不能在執行中動態確定。建構函式因為負責構造物件,所以也不能是虛函式。而析構函式一般是虛函式。
對於析構函式一般都是虛函式的解釋:
4:指標,或者引用才能實現多型
例題:
1 #include 2第乙個p->foo()和p->fuu()都很好理解,本身是基類指標,指向的又是基類物件,呼叫的都是基類本身的函式。3using
namespace
std;45
classa6
12virtual
void
fuu()
1316
};17
class b:publica18
24void
fuu()
2528
};29
intmain()
30
第二個p->foo()和p->fuu()則是基類指標指向子類物件,正式體現多型的用法,p->foo()由於指標是個基類指標,指向是乙個固定偏移量的函式,因此此時指向的就只能是基類的foo()函式的**了。而p->fuu()指標是基類指標,指向的fuu是乙個虛函式,由於每個虛函式都有乙個虛函式列表,此時p呼叫fuu()並不是直接呼叫函式,而是通過虛函式列表找到相應的函式的位址,因此根據指向的物件不同,函式位址也將不同,這裡將找到對應的子類的fuu()函式的位址。
多型的概念
前幾天有人問我多型的概念,一時半會也沒說清。這種基本概念有時經常能問倒人,特此在這寫一下,表述我對多型的理解。多型就是明明是乙個a物體卻表現出b物體的行為。在 中,多型的實現務必要和繼承,重寫方法聯絡起來。具體的說乙個父類,乙個子類。宣告的時候用父類,賦值的時候用子類。此時執行父類例項的方法的時候,...
C 多型的概念
完成某一行為,不同物件去做,會有不同的效果必須通過基類的指標或者引用呼叫虛函式 被呼叫的函式必須是虛函式,子類繼承了父類,且派生類必須對基類的虛函式進行重寫 下面來解釋這兩個條件的具體含義。首先在編寫多型程式的時候,希望父物件裡的某個函式能實現多型功能,就必須將其加virtual修飾,且在派生物件中...
多型的概念和作用
多型是物件導向的重要特性,簡單點說 乙個介面,多種實現 就是同一種事物表現出的多種形態。程式設計其實就是乙個將具體世界進行抽象化的過程,多型就是抽象化的一種體現,把一系列具體事物的共同點抽象出來,再通過這個抽象的事物,與不同的具體事物進行對話。對不同類的物件發出相同的訊息將會有不同的行為。比如,你的...