父類子類指標函式呼叫注意事項
1,如果以乙個基礎類指標指向乙個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩)
2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。(一般不會這麼去定義)
3,如果基礎類和衍生類定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式時,到底呼叫那個函式要根據指標的原型來確定,而不是根據指標實際指向的物件型別確定。
虛函式就是為了對「如果你以乙個基礎類指標指向乙個衍生類物件,那麼通過該指標,你只能訪問基礎類定義的成員函式」這條規則反其道而行之的設計。
如果你預期衍生類由可能重新定義乙個成員函式,那麼你就把它定義成虛函式( virtual )。
polymorphism就是讓處理基礎類別物件的程式**能夠通透的繼續適當地處理衍生類物件。
純虛函式:
virtual void myfunc ( ) =0;
純虛函式不許定義其具體動作,它的存在只是為了在衍生類鐘被重新定義。只要是擁有純虛函式的類,就是抽象類,它們是不能夠被例項化的(只能被繼承)。如果乙個繼承類沒有改寫父類中的純虛函式,那麼他也是抽象類,也不能被例項化。
抽象類不能被例項化,不過我們可以擁有指向抽象類的指標,以便於操縱各個衍生類。
虛函式衍生下去仍然是虛函式,而且還可以省略掉關鍵字「virtual」。
看個例子:
#include usingaptr->foo()輸出結果是:namespace
std;
classa
virtual
void
bar()
}; class b: publica
void
bar()
}; int
main()
b's foo()//這個明白,多型性
a's foo()//這個也明白,執行a::foo();
b's bar()//雖然呼叫的是這個函式:a::foo(); 但隱式傳入的還是bobj 的位址,所以再次呼叫bar();呼叫時還是會呼叫b的函式, 與虛函式指標有關
aobj.foo()輸出結果是:
a's foo() //這個不是指標,aobj完全是乙個a的物件,與多型沒有關係
a's bar()
c 父類指標指向子類物件
父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...
父類指標指向子類物件問題
子類與父類指標呼叫相關注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困...
父類指標指向子類物件的理解
虛函式 父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師...