Размер абстрактного класса - PullRequest
3 голосов
/ 14 апреля 2010

Как узнать размер абстрактного класса?

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

Поскольку это абстрактный класс, я не могу создавать объекты этого класса. Как мне найти размер абстрактного класса A с помощью оператора sizeof?

Ответы [ 7 ]

9 голосов
/ 14 апреля 2010

Вы можете использовать оператор sizeof:

int a_size = sizeof(A);
3 голосов
/ 14 апреля 2010

Как уже говорилось, вопрос на самом деле не имеет смысла - у экземпляра есть размер, а у класса действительно нет. Поскольку вы не можете создать экземпляр, «размер» в большинстве случаев является бессмысленным понятием. Вы можете использовать sizeof(A), но результат мало что значит - благодаря пустой оптимизации базового класса (для одного очевидного примера), 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;
}

Если я запускаю это на своем компьютере, sizeof(A) отображается как 1. Очевидным выводом будет то, что sizeof(Z) должно быть как минимум четыре - но в действительности с компиляторами, которые у меня есть (VC ++, g ++) отображается как три и один соответственно.

2 голосов
/ 14 апреля 2010

Прямой ответ заключается в том, что оператор sizeof может принимать либо объект , либо тип:

sizeof (A)

Но на самом деле, зачем тебе это делать? Тот факт, что вы спрашиваете об этом, кажется поводом для беспокойства.

0 голосов
/ 19 августа 2010

Насколько я знаю, по умолчанию размер абстрактного класса эквивалентен размеру int. так на 32-битной машине размер вышеупомянутого класса составляет 4 байта.

0 голосов
/ 14 апреля 2010

Помимо других ответов, в которых предлагается использовать имя класса в качестве аргумента sizeof, вы также можете объявить указатель на абстрактный класс

A *p = NULL;

и затем используйте *p в качестве аргумента в sizeof

size_t size = sizeof *p;

Это прекрасно, так как аргумент sizeof не оценивается.

0 голосов
/ 14 апреля 2010

Нет необходимости создавать объект для определения размера класса. Вы можете просто сделать sizeof(A).

0 голосов
/ 14 апреля 2010

sizeof (A) работает нормально, вам на самом деле не нужен экземпляр класса.

...