C 虛表(探索多型的原理)和菱形繼承

2021-07-27 00:16:50 字數 852 閱讀 3222

菱形繼承(多繼承): 兩個子類繼承同乙個父類,而又有子類 同時繼承這兩個子類。

菱形繼承關係模型如下圖:

菱形繼承的**如下:dd的物件中有兩個aa成員

#include#includeusing namespace std;

class aa

;class bb:public aa

;class cc:public aa

;class dd:public bb, public cc

;int main()

菱形虛擬繼承的**如下:

#include#includeusing namespace std;

class aa

;class bb:virtual public aa

;class cc:virtual public aa

;class dd:public bb, public cc

;int main()

{ aa a;

bb b;

cc c;

dd d;

d._aa = 0;

d._bb = 1;

d._cc = 2;

d._dd = 3;

cout<

虛擬繼承雖然解決了二異性和資料冗餘的問題,但由兩個執行結果可發現子類的大小並沒有減小反而曾大了,比預算的多出了8個位元組,則進一步探索其記憶體,可直觀的看出其原因。

菱形物件模型:

菱形虛擬物件模型:

多型:當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類虛函式,指向子類呼叫的就是子類虛函式

C 多型(二)虛表剖析以及菱形繼承

我們在類的成員函式的時候就已經接觸到了函式過載,但是並不知道它是多型的一種表現,函式過載的特徵 1 同一作用域 基類和派生類不是同一作用域 2 函式名字相同 3 引數不同 引數型別不同,引數個數不同,排布順序不同 4 返回值型別可以不同 1 不在同一作用域 分別在基類和派生類 2 函式名相同 引數相...

C 中的菱形繼承和虛繼承簡述

多繼承概念 我們可以從乙個類繼承,我們也可以能同時從多個類繼承,這就是多繼承。但是由 於多繼承是非常受爭議的,從多個類繼承可能會導致函式 變數等同名導致較多的 歧義。如以下所示,訪問變數時候要加上作用域,表示訪問的是哪個變數和函式 include include using namespace st...

C 繼承 菱形繼承和虛繼承的那些事兒

繼承是c 語言的一種重要機制,該機制自動地為乙個類提供來自另乙個類的操作和資料結構,這使得程式設計師只需在新類中定義已有類中沒有的成分來建立新類。繼承使得我們得以用一種簡單的方式來描述事物 物件導向程式設計可以讓你宣告乙個新類作為另乙個類的派生。派生類 子類繼承它父類的屬性和操作。子類同時也宣告了新...