Виртуальное ромбовидное наследование (пример 2)

Указанная иерархия уже реализует виртуальный ромб: B и C совместно используют одну базовую часть A внутри D. Обращение к h через обе ветви относится к одному объекту.

Короткий ответ

Что ответить на собеседовании

Указанная иерархия уже реализует виртуальный ромб: 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 был бы неоднозначен.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее