類之多型的理解

2021-06-02 01:54:04 字數 1333 閱讀 5883

多型的理解:

使用基類指標呼叫派生類成員

#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的實際變數和方法,來進行...