天天看點

[轉載]父類指針指向子類對象的了解

父類子類指針函數調用注意事項

1,如果以一個基礎類指針指向一個衍生類對象(派生類對象),那麼經由該指針隻能通路基礎類定義的函數(靜态聯翩)

2,如果以一個衍生類指針指向一個基礎類對象,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式員帶來困擾。(一般不會這麼去定義)

3,如果基礎類和衍生類定義了相同名稱的成員函數,那麼通過對象指針調用成員函數時,到底調用那個函數要根據指針的原型來确定,而不是根據指針實際指向的對象類型确定。

虛拟函數就是為了對“如果你以一個基礎類指針指向一個衍生類對象,那麼通過該指針,你隻能通路基礎類定義的成員函數”這條規則反其道而行之的設計。

如果你預期衍生類由可能重新定義一個成員函數,那麼你就把它定義成虛拟函數( virtual )。

polymorphism就是讓處理基礎類别對象的程式代碼能夠通透的繼續适當地處理衍生類對象。

純虛拟函數:

virtual void myfunc ( ) =0;

純虛拟函數不許定義其具體動作,它的存在隻是為了在衍生類鐘被重新定義。隻要是擁有純虛拟函數的類,就是抽象類,它們是不能夠被執行個體化的(隻能被繼承)。如果一個繼承類沒有改寫父類中的純虛函數,那麼他也是抽象類,也不能被執行個體化。

抽象類不能被執行個體化,不過我們可以擁有指向抽象類的指針,以便于操縱各個衍生類。

虛拟函數衍生下去仍然是虛拟函數,而且還可以省略掉關鍵字“virtual”。

看個例子:

<a></a>

aptr-&gt;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()

本文轉自五嶽部落格園部落格,原文連結:http://www.cnblogs.com/wuyuegb2312/articles/2997396.html,如需轉載請自行聯系原作者

繼續閱讀