Есть код:
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 память для хранения всех производных классов?
Верна ли моя догадка?