3

抽象クラスのサイズを確認するにはどうすればよいですか?

class A
{
    virtual void PureVirtualFunction() = 0;
};

これは抽象クラスなので、このクラスのオブジェクトを作成できません。「sizeof」演算子を使用して抽象クラス A のサイズを見つけるにはどうすればよいですか?

4

7 に答える 7

9

次の演算子を使用できます。sizeof

int a_size = sizeof(A);
于 2010-04-14T07:55:49.643 に答える
2

直接的な答えは、sizeof演算子がオブジェクトまたは型のいずれかを取ることができるということです:

sizeof (A)

しかし、本当に、なぜこれをやりたいのですか?あなたがこれを尋ねているという事実は、懸念の原因のようです。

于 2010-04-14T07:58:01.700 に答える
2

前述のように、この質問には意味がありません。インスタンスにはサイズがありますが、クラスには実際にはありません。抽象クラスのインスタンスを作成することはできないため、そのサイズはほとんど意味のない概念です。を使用できますsizeof(A)が、結果はあまり意味がありません。空の基底クラスの最適化のおかげで (1 つの明白な例として)、基底クラスとしての使用が派生クラスのサイズにどれだけ寄与するかを必ずしも示しているsizeof(A)わけではありません。A

例えば:

#include <iostream>

class A {};
class B {};
class C {};
class D {};

class Z : public A, public B, public C, public D {};

int main() { 
     std::cout << "sizeof(A) = " << sizeof(A);
     std::cout << "sizeof(Z) = " << sizeof(Z);
     return 0;
}

これを自分のコンピューターで実行すると、 1 とsizeof(A)表示されます。明らかな結論はsizeof(Z)、少なくとも 4 でなければならないということです。しかし、実際には、手元にあるコンパイラ (VC++、g++) では、それぞれ 3 と 1 と表示されます。

于 2010-04-14T08:07:51.463 に答える
0

'sizeof(A)' は問題なく動作します。実際にはクラスのインスタンスは必要ありません。

于 2010-04-14T07:57:33.980 に答える
0

クラスのサイズを見つけるためにオブジェクトを作成する必要はありません。簡単にできますsizeof(A)

于 2010-04-14T07:57:55.630 に答える
0

クラスの名前を の引数として使用することを提案した他の回答に加えて、sizeof抽象クラスへのポインターを宣言することもできます

A *p = NULL;

そして、*p引数として使用しますsizeof

size_t size = sizeof *p;

の引数はsizeof評価されないので、これはまったく問題ありません。

于 2010-04-14T08:07:21.853 に答える
-3

私の知る限り、デフォルトでは、抽象クラスのサイズは int のサイズに相当します。そのため、上記のクラスの 32 ビット マシン サイズは 4 バイトです。

于 2010-08-19T12:58:42.323 に答える