父類子類指標函式呼叫注意事項
1,如果以乙個基礎類指標指向乙個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(
靜態聯翩)
2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。(一般不會這麼去定義)
3,如果基礎類和衍生類定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式時,到底呼叫那個函式
要根據指標的原型來確定,而不是根據指標實際指向的物件型別確定。
虛函式就是為了對「如果你以乙個基礎類指標指向乙個衍生類物件,那麼通過該指標,你只能訪問基礎類定義的成員函式」這條規則反其道而行之的設計。
如果你預期衍生類由可能重新定義乙個成員函式,那麼你就把它定義成虛函式( virtual )。
polymorphism就是讓處理基礎類別物件的程式**能夠通透的繼續適當地處理衍生類物件。
純虛函式:
virtual void myfunc ( ) =0;
純虛函式不許定義其具體動作,它的存在只是為了在衍生類鐘被重新定義。
只要是擁有純虛函式的類,就是抽象類,它們是不能夠被例項化的(
只能被繼承)。
如果乙個繼承類沒有改寫父類中的純虛函式,那麼他也是抽象類,也不能被例項化。
抽象類不能被例項化,不過我們可以擁有指向抽象類的指標,以便於操縱各個衍生類。
虛函式衍生下去仍然是虛函式,而且還可以省略掉關鍵字「virtual」。
看個例子:
#include using namespace std;
class a
virtual void bar()
}; class b: public a
void bar()
}; int main()
aptr->foo()輸出結果是:
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()
基類指標指向派生類物件
成員函式一般化三個結論 include using std cout using std endl class employee class dev public employee int main 1.如果以 基類指標 指向 派生類物件 那麼經由該指標只能呼叫基類所定義的函式 2.如果以 派生類指...
基類指標指向派生類物件
派生類物件也 是 基類物件,但兩者不同。派生類物件可以當做基類物件,這是因為派生類包含基類的所有成員。但是基類物件無法被當做成派生類物件,因為派生類可能具有只有派生類才有的成員。所以,將派生類指標指向基類物件的時候要進行顯示的強制轉換,否則會使基類物件中的派生類成員成為未定義的。總結 基類指標和派生...
基類指標指向派生類物件
派生類物件也 是 基類物件,但兩者不同。派生類物件可以當做基類物件,這是因為派生類包含基類的所有成員。但是基類物件無法被當做成派生類物件,因為派生類可能具有只有派生類才有的成員。所以,將派生類指標指向基類物件的時候要進行顯示的強制轉換,否則會使基類物件中的派生類成員成為未定義的。總結 基類指標和派生...