5

以下のコードを検討してください。

#...
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 を追加しています。

*。ここでの私の最初の質問です。何か問題が見つかった場合は修正してください。

4

2 に答える 2

8

つまり、クラスが仮想であるかどうかが原因ではなく、すべてのオブジェクトをメモリ アドレスで区別できるようにすることが標準で要求されているためです。この質問を参照してください:

C++ の空のクラスのサイズがゼロでないのはなぜですか?

于 2013-02-06T08:12:22.097 に答える
0

広告1.PeddleSpamの回答を参照してください

ad 2. IIRCコンパイラーは、仮想関数ポインターだけでなく、より多くの情報をいわゆるVMTに入れます。もう1つの情報は、仮想AのCでの位置です。

広告3.2を参照してください。

于 2013-02-06T09:57:50.280 に答える