Указанная иерархия уже реализует виртуальный ромб: B и C совместно используют одну базовую часть A внутри D. Обращение к h через обе ветви относится к одному объекту.
Виртуальное ромбовидное наследование (пример 2)
Указанная иерархия уже реализует виртуальный ромб: B и C совместно используют одну базовую часть A внутри D. Обращение к h через обе ветви относится к одному объекту.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо продемонстрировать схему ромбовидного наследования, используя виртуальные базовые классы.
struct A {
int h;
};
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };
Ответ
Указанная иерархия уже реализует виртуальный ромб: B и C совместно используют одну базовую часть A внутри D. Обращение к h через обе ветви относится к одному объекту.
Например:
D object{};
object.h = 7;
A* fromB = static_cast<B*>(&object);
A* fromC = static_cast<C*>(&object);
assert(fromB == fromC);
Для assert подключите . Виртуальную базу конструирует D; если у A нет конструктора по умолчанию, D должен явно её инициализировать. Без virtual в B и C эти указатели обозначали бы разные подобъекты A, а доступ object.h был бы неоднозначен.