выделяет ли память для объекта базового класса память для производного класса?

0
class A {
     private:
           int _a;
     public:
           //some virtual methods...
};

class B : public A {
     private:
           int _b;
     public:
            //methods..
};

при объявлении указателя типа A:

A* a = new A();

делает виртуальные таблицы создано подходит размер обоих INTS а и б, или же пространство, выделенное подходит только объект типа A?

  • 0
    vtables не создаются объектными экземплярами.
  • 0
    Vtable не имеет ничего общего с переменными-членами - он имеет отношение только к виртуальным функциям-членам.
Теги:
memory-management
vtable

6 ответов

4
Лучший ответ

Конечно нет!!

Класс A не знает о существовании класса B

Но класс B наследует A поэтому он действительно знает A

Другими словами, то, что это происходит, противоположно:

Объем памяти, выделяемый при создании экземпляра класса B, достаточен для размещения членов класса B и унаследованных членов класса A

2

Вы создаете объект типа A. Таким образом, память будет выделена для этого типа объекта. Он будет достаточно большим, чтобы содержать int _a и vptr. Я думаю, если размер указателя равен 4, то для объекта типа A будет выделено 8 байт.

Вы должны понимать, что базовые классы ничего не знают о том, какие производные классы будут определены на основе базовых классов.

Однако если вы напишете

A* a = new B();

то в памяти будет создан объект типа B. Но статический тип указателя a есть A *. Таким образом, вы не можете получить доступ к элементу данных _b без указателя dynamic_cast или static_cast a для типа B *.

1

Только A

В противном случае A будет расти, когда кто-то создаст новые классы: C, D, E ,... все они происходят от A Это было бы абсурдно.

1

НЕТ, и причина очень проста:

Класс не содержит ни одного из членов класса В или методов.

=> Итак, пространство памяти для B не обязательно

1

Класс A не знает о своих производных классах (они могут быть физически полностью разделены, в других единицах компиляции, загружаемых позже во время выполнения). Даже если бы это было так, нет смысла выделять пространство для всех его производных классов, потому что это не его производные классы.

Так же, как родители не ходят в школу для своих детей, класс не действует в своих производных классах.

создает ли виртуальная таблица, соответствующую размеру как ints a, так и b, или выделяемое пространство подходит только для объекта типа A?

В любом случае, эти члены не входят в виртуальную таблицу. Что касается членов, которые входят в vtable (= виртуальные функции), то применяется следующее: базовый класс vtable достаточно велик для виртуальных функций, которые он объявляет, и нет других.

  • 0
    Я думал об этом, но прочитал вопрос внимательнее - это конкретно про vtable.
  • 0
    @BoBTFish Это вполне может быть, но то же самое относится.
Показать ещё 2 комментария
1

Он не создает vtable - там (обычно) только один из них для каждого класса. Он создает объект типа A с достаточным пространством для элемента (ов) A Он не создает объект типа B (или что-то еще), поскольку это не тип, заданный новым выражением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню