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?
Конечно нет!!
Класс A
не знает о существовании класса B
Но класс B
наследует A
поэтому он действительно знает A
Другими словами, то, что это происходит, противоположно:
Объем памяти, выделяемый при создании экземпляра класса B
, достаточен для размещения членов класса B
и унаследованных членов класса A
Вы создаете объект типа A. Таким образом, память будет выделена для этого типа объекта. Он будет достаточно большим, чтобы содержать int _a и vptr. Я думаю, если размер указателя равен 4, то для объекта типа A будет выделено 8 байт.
Вы должны понимать, что базовые классы ничего не знают о том, какие производные классы будут определены на основе базовых классов.
Однако если вы напишете
A* a = new B();
то в памяти будет создан объект типа B. Но статический тип указателя a есть A *. Таким образом, вы не можете получить доступ к элементу данных _b без указателя dynamic_cast или static_cast a для типа B *.
Только A
В противном случае A
будет расти, когда кто-то создаст новые классы: C
, D
, E
,... все они происходят от A
Это было бы абсурдно.
НЕТ, и причина очень проста:
Класс не содержит ни одного из членов класса В или методов.
=> Итак, пространство памяти для B не обязательно
Класс A
не знает о своих производных классах (они могут быть физически полностью разделены, в других единицах компиляции, загружаемых позже во время выполнения). Даже если бы это было так, нет смысла выделять пространство для всех его производных классов, потому что это не его производные классы.
Так же, как родители не ходят в школу для своих детей, класс не действует в своих производных классах.
создает ли виртуальная таблица, соответствующую размеру как ints a, так и b, или выделяемое пространство подходит только для объекта типа A?
В любом случае, эти члены не входят в виртуальную таблицу. Что касается членов, которые входят в vtable (= виртуальные функции), то применяется следующее: базовый класс vtable достаточно велик для виртуальных функций, которые он объявляет, и нет других.
Он не создает vtable - там (обычно) только один из них для каждого класса. Он создает объект типа A
с достаточным пространством для элемента (ов) A
Он не создает объект типа B
(или что-то еще), поскольку это не тип, заданный новым выражением.