以下のコードを検討してください。
#...
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.
質問:
- sizeof(A) = 1byte であり、この場所はコンパイラ/私たちにとって重要なものを保持します。
- 実際には何も存在しないのに、コンパイラがわざわざ C クラス オブジェクトに vptr を追加するのはなぜですか。
- 仮想関数がない場合、コンパイラは派生オブジェクトに余分な vptr を追加しています。
*。ここでの私の最初の質問です。何か問題が見つかった場合は修正してください。