派生類例項 傳入 基類引用引數。將派生類物件 視為基類物件,並 執行派生類的被覆蓋函式。
ps.好吧,下面,我又刨根問底兒了:
覆蓋的條件:
#include #include using namespace std;
class fish
};class tuna: public fish
};class carp: public fish
};void makefileswim(fish& inputfish)
int main()
基類指標 指向 派生類物件,需要 在基類定義虛析構函式。
堆上定義的派生類物件,若無虛建構函式,delete時 無法 析構派生類部分記憶體。
#include #include using namespace std;
class fish
virtual ~fish()
};class tuna :public fish
~tuna()
};void deletefishmemory(fish* pfish)
int main()
以上「派生類例項 傳入 基類例項的引用引數」,派生類例項呼叫哪個覆蓋函式 是在執行階段決定的/即多型的邏輯決定的,這種邏輯是編譯器在編譯階段提供的,即虛函式表。
編譯器分別為「實現了虛函式的基類」 和 「覆蓋了虛函式的派生類」分別建立乙個虛函式表(vft)。例項化基類或者派生類時,會為對應的類 建立乙個隱藏的指標,指向相應的vft。可以將vft視為乙個包含函式指標的靜態陣列
,其中 每個指標都指向相應的虛函式的實現
上圖derived類,除了base類的func2(),其餘都進行了覆蓋:
derived obj;
obj.func2(); //呼叫的是base的func2()
void dosomething(base& obj)
int main()
不能例項化的基類!宣告純虛函式,可建立抽象基類。抽象基類的派生類 必須 實現純虛函式。
#include #include using namespace std;
class fish ;
class tuna :public fish
};void makefishswim(fish& inputfish)
int main()
解決菱形繼承成員變數二義性問題,使用虛繼承。
#include #include using namespace std;
class animal
int age;
};class mammal:public virtual animal{}; //virtual虛繼承
class bird:public virtual animal{};
class reptile:public virtual animal {};
class platypus final :public mammal, public bird, public reptile
};int main()
//o:animal constructor
// platypus constructor
override限定符:核實被覆蓋的函式
在基類裡 是否宣告為虛的。
final:不能在派生類進行覆蓋。
class derived:public base
void last() final
};
c 筆記 多型
編譯時的多型是通過靜態連編來實現的 執行時的多型是通過動態連編來實現的 利用虛函式機制,c 可部分地採用動態連編 在c 中,編譯時的多型性主要是通過函式過載和運算子過載實現的,執行時多型性主要是通過虛函式來實現的 virtual 返回型別 函式名 形參表 在基類中的某個成員函式被宣告為虛函式後,此虛...
c 多型筆記
if語句或switch語句會帶來混亂,且不遵守設計模式中的 開閉原則 開閉原則指的是 對擴充套件開放,對修改關閉 用多型 同乙個介面,使用不同的例項而執行不同操作 條件語句 public class test if command drivecommand.stop switch command p...
C 多型的小總結
多型 多型的概念 相同物件收到不同訊息或不同物件收到相同的訊息時產生不同的動作 即允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話 允許將子類型別的指標賦值給父類型別的指標。多型分類 1 靜態多型 也...