多型的理解:
使用基類指標呼叫派生類成員
#include
using namespace std;
class left
int left;
};class right
int right;
};class bottom: public left, public right
void funleft()
void funright() };
void main()
執行結果:
funleft2
funright2
結果大家應該很清楚, 但是開始的時候我不明白為什麼會這樣.
讓我們理解每段段語句 (一下全部為個人理解)
bottom *b = new bottom;
申請乙個存放類bottom的儲存空間如圖,並把首位址賦給b(其中實現了類left和right,派生類中的虛函式覆蓋基類中的虛函式)
left *l = b;
意思是讓 i 指向 b 的首位址, 因為b已經實現了 left,又因為 i 指向已實現類left的首址, 所以可以用 l->funleft(); 呼叫了類left中的成員函式funleft().又因為 i 為left型別的所以i不能呼叫right型別的成員 即 l->funright(); 是錯誤的
根據上面的理解
right *r = b;
r指向b的首址, 可是 不是應該將r指向類right的首址, 才能用r訪問right的成員嗎?
看另乙個例子
bottom *b = new bottom;
right *r=b;
right *r1=(right *)(((int *)b)+2);//首位址加上2*4(int 型別的長度為4)
r->funright();
r1->funright();
結果為funright2
funright2
因為指標 r 是類right的首位址,所以 r 能呼叫類right的成員
所以對上述的回答是 : 這是因為編譯器將自動加上偏移量
個人總結:
派生類中的非虛函式不會覆蓋基類中的非虛函式, 派生類中的虛函式則會覆蓋基類中的虛函式.
乙個已知類滿足2個條件就可用呼叫自己成員 : 一是這個類已經被實現, 二是已經獲得這個類的首位址(指向這個類的指標).
所以繼承中 用派生類實現基類. 後可用派生類呼叫基類成員(因為基類在派生類中實現, 首址為派生類首址, 滿足2個條件), 也可用基類指標呼叫基類的成員(因為基類在派生類中實現, 首址為派生類中基類的首址, 也滿足個條件)。
以上全部為個人的理解 如有誤 望指點
理解java的三大特性之多型
物件導向的三大特性 封裝 繼承 多型。封裝和繼承幾乎都是為多型而準備的。這是我們最後乙個概念,也是最重要的知識點。一 概念 多型的定義 指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。傳送訊息就是函式呼叫 實現多型的技術稱為 動態繫結 dynamic ...
C 小實驗之多型性理解
為了理解多型性,做了乙個小實驗,用事實說話 如下 include include using namespace std class cup class teacup class fathor virtual void vf2 float x virtual void vf3 float x voi...
多型 抽象類的理解
多型 乙個類在不同時刻表現出的具體物件 前提 有繼承關係,有方法重寫,父類引用指向子類物件 父類引用指向子類物件 相當於指定了類在當下情況下的具體物件 例如 乙個父類a有三個子類b,c,d 而 a 物件名 new b 這一句則是明確告訴編譯器,現在這個類的具體物件是b,根據b的實際變數和方法,來進行...