簡體   English   中英

C ++:虛擬繼承

[英]C++: Virtual Inheritance

請考慮以下代碼:

#...
class A {};
class B: public A{};
class C: virtual public A{};
class D: virtual public C{};
// No More Classes
...
int _tmain(int argc, _TCHAR* argv[]) {
 cout<<sizeof(A)<<" ";
 cout<<sizeof(B)<<" ";
 cout<<sizeof(C)<<" ";
 cout<<sizeof(D)<<".";

 ...
}

O / P:1 1 4 8。

題:

  1. sizeof(A)= 1byte,這個位置對於編譯器/我們來說意義重大。
  2. 為什么編譯器在實際上沒有任何內容時,在C類對象中添加vptr。
  3. 如果我們沒有任何虛函數,編譯器會向派生對象添加額外的vptr。

*。 這是我的第一個問題,如果你發現任何錯誤,請糾正我。

簡而言之,這不是因為類是虛擬的,而是因為標准要求所有對象都可以通過它們的內存地址來區分。 看到這個問題:

為什么C ++中空類的大小不為零?

廣告1.請參閱PeddleSpam的回答

ad 2. IIRC,編譯器將比虛擬函數指針更多的信息放入所謂的VMT中。 我想,還有一個信息是虛擬A在C中的位置。

廣告3.見2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM