Почему свойства наследуемого класса сохраняются в базовом?

Есть код:
struct A {
    int a;
    virtual ~A() {}
};
struct B: public A {
    int b;
    B(int _b):b(_b){}
    virtual ~B() {}
};


int main(int argc, char* argv[])
{
    A* a = new B(2);
    cout << ((B *)a)->b <<endl;
    return 0;
}


После выполнения выводит ((B *)a)->b = 2.

Почему в A *a сохраняется значение b = 2?
Ведь базовый класс не содержит этого поля.
Ведь sizeof(*a) < sizeof(*b), где физически он хранит член b и как действует этот механизм?

Компилятор выделяет под new A память для хранения всех производных классов?
Верна ли моя догадка?
  • Вопрос задан
  • 2556 просмотров
Решения вопроса 1
Компилятор выделяет под new A память для хранения всех производных классов?

конечно нет, он не знает всех производных классов, если вы напишете new A то вам и выделят память под объект типа A.

Другое дело что в вашем примере вы выделяете память под объект типа B, а не A:
A* a = new B(2);

так что не очень понимаю ваше удивление, вы выделили памяти достаточно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Потому что А *а это указатель и он хранить только адрес выделенной памяти, а память вы выделяете под экземпляр структуры B.
Далее вы его явно приводите к B *, и после разыменования работаете с экземпляром B.

Компилятор выделяет под new A память для хранения всех производных классов

Нет догадка неверна, да и в коде у вас new B(2).
Ответ написан
Комментировать
iCune
@iCune Автор вопроса
Спасибо! Вопрос всплыл по невнимательности.
А где-нибудь регламентирован порядок расположения в памяти членов базового/ производных классов?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы