幾點知識:
無論父類裡面有沒有虛函式,都可以定義指向子類例項的父類指標.
如果父類裡沒有虛函式,則使用父類指標,只能訪問父類的成員,而不能訪問子類裡的成員.
如果父類裡的虛函式不是純虛函式,且子類裡沒有重寫該虛函式,則用父類指標訪問該虛函式的時候,跟訪問父類裡的普通函式一樣.
如果父類裡的虛函式不是純虛函式,且子類裡重寫了該虛函式,則用父類指標訪問該虛函式的時候訪問的是子類裡重寫後的函式.
如果父類裡的虛函式是純虛函式,則父類是個抽象類,子類要想能夠被例項化,則必須重寫該純虛函式.用父類指標訪問該純虛函式的時候,訪問到的是子類裡重寫了的函式.
再有乙個要注意的是析構函式要宣告為虛函式,這樣在delete父類指標的時候,才會呼叫例項化的子類的虛函式,否則只會呼叫父類的析構函式,造成子類的剩餘部分沒被釋放,從而造成記憶體的洩漏.
總結:當定義乙個指向子類例項的父類指標的時候,記憶體中例項化了子類,由於子類繼承了父類,因此記憶體中的子類裡包含父類的所有成員.但由於宣告的是父類指標,因此該指標不能夠訪問子類的成員.而只能訪問父類的成員.然而在父類裡可以宣告純虛函式和定義虛函式.使用父類指標訪問虛函式或純虛函式的時候,訪問到的是子類裡重寫的函式. 當然,對於虛函式,如果子類裡沒有對其重寫的話,仍然訪問到父類裡定義的虛函式.可見虛函式和純虛函式的卻別僅僅在於:純虛函式沒有定義,只有宣告,而且它使擁有它的類成為抽象類.
以下內容來自:
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()
解釋虛函式的例子(父類子類指標函式呼叫注意事項)
父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...
父類為形參,子類為實參時的注意事項
include using namespace std class fish class carp public fish void showinf fish fish 直接進行普通的值傳遞 int main 當函式引數是父類物件且傳入的引數是子類物件,然而我們用的是普通值傳遞時,子類物件僅僅將自己...
學習指標注意事項
宣告指標的一般形式 資料型別 指標變數名 1 在初始化時賦值 2 在後期賦值 1 通過變數名訪問乙個變數是直接的,通過指標訪問乙個變數是間接的 2 p i 意思是取變數i的位址賦給變數p 1 指標變數名是p,而不是 p 2 指標變數不可以直接賦值 int a 100 int p p 100 編譯不能...