虛繼承和虛函式繼承

2022-08-15 21:18:14 字數 1549 閱讀 1143

虛繼承主要用於菱形 形式的繼承形式

虛繼承是為了在多繼承的時候避免引發歧義, 

比如類a有個就是a,b繼承了a,c也繼承了a,當d多繼承b,c時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。 

虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多型性,也叫動態編聯

虛函式繼承:

class a 

通俗的講,虛繼承就是為了節約記憶體的,他是多重繼承中的特有的概念。適用與菱形繼承形式。 

如:類b、c都繼承類a,d繼承類b和c。為了節省記憶體空間,可以將b、c對a的繼承定義為虛擬繼承,此時a就成了虛擬基類。 

class a; 

class b:vitual public a; 

class c:vitual public a; 

class d:public b,public c; 

虛函式繼承就是覆蓋。即基類中的虛函式被派生類中的同名函式所覆蓋。 

class parent 

; void foo1(); 

}; class son:public parent 

; void foo1(); 

}; int main() 

其輸出結果是: 

foo from son,foo1 from parent

1、真正意義上的虛函式呼叫,是執行時繫結的;

2、什麼是真正意義上的虛函式呼叫?通過指標或者引用執行虛函式;

3、通過物件執行虛函式會不會是動態繫結的?不會。

4、乙個類是否有虛函式,就看它是否包含乙個指向虛函式表的指標;

5、如果類本身含有virtual 宣告的函式,或者繼承了virtual 函式,那麼它肯定會包含乙個指向虛函式表的指標;

6、從純抽象類或者非抽象類繼承了virutal,意義上是一樣的,效率上是一樣的,並不因為你是純抽象類的繼承而效率變高;

7、虛函式呼叫比普通函式呼叫慢多少?假設這個函式僅執行 return i  > j,大概慢 15%左右(3000萬 * 100次規模測試),如果是個真正有意義上的函式,效率影響可以忽略不計;

8、因此說虛函式慢的基本上是放屁,擔心虛函式影響效率的基本上是杞人憂天;

9、虛函式會慢,但是那是對內聯函式而言的,虛函式會忽略 inline字首,請注意這一點;

10、繼承層次不影響虛函式效率,如果你這個類是原始類的第10層繼承,那麼虛函式呼叫效率和第1層繼承的類沒有差別,當然如果你要在該函式中呼叫上一層的虛函式那就另當別論了;

11、每個類應該只有乙個virtual table,而不是每個物件有乙個(物件只含有指向虛表的指標),那些說虛函式增大空間開銷的可以自宮了;

12、如果乙個類含有虛函式,在構造時,使用memset(this, 0, sizeof(*this))是找死的行為;

13、虛函式是執行時多型,模板是編譯時多型,乙個動,乙個是靜。

14、子類覆蓋父類的虛函式的時候,實際上是在建構函式中修改了虛表中的函式指標;因此使得 fatherclass* p = new childclass();的情況下,p->virtualfunc()始終執行的是子類的虛函式;

虛函式 虛繼承

include using namespace std class a class b public a class c public b int main 結果是 4,4,4 為什麼?一,在private,protect,public的實際繼承中,派生類和基類擁有相同的虛函式表。但如果是虛繼承,會...

虛函式,虛繼承

1 空類,空類單繼承,空類多繼承的sizeof include using namespace std class base1 class base2 class derived1 public base1 class derived2 public base1,public base2 int m...

虛繼承 虛函式

1.虛繼承簡單的說就是如果有兩個類都繼承了同乙個基類 a 那麼,如果有第三個類又繼承了這兩個類,第三個類就會出現有 兩個基類 a 的情況,虛繼承就能避免這種情況。從實現 來看 普通繼承 普通繼承 沒有使用虛基類 基類a class a class b public a class c public ...