Во-первых, в вашем примере нет виртуальных базовых классов . Классы, которые содержат виртуальные функции, называются polymorphic . (В C ++ существует такая вещь, как «виртуальные базовые классы», но она не имеет ничего общего с вашим примером.)
Во-вторых, поведение вашего кода не зависит от каких-либо виртуальных объявлений. Вы сознательно уничтожили целостность базового указателя с помощью reinterpret_cast
. По этой причине поведение кода undefined .
Прямое приведение от одного базового указателя к другому (что вы пытаетесь сделать в своем коде) называется перекрестное приведение . Единственное приведение в C ++, которое может выполнять перекрестное приведение, это dynamic_cast
.
t.push_back(dynamic_cast<T *>(u[0]));
Вы можете выполнить косвенное перекрестное приведение без dynamic_cast
, но для этого сначала нужно уменьшить указатель на производный тип (A *
), используя static_cast
, а затем преобразовать его в другой базовый тип указателя
t.push_back(static_cast<A *>(u[0])); // upconversion to `T *` is implicit