Виртуальное наследование в обеих промежуточных ветвях даёт D единственный подобъект A. Поэтому obj.h становится однозначным и обозначает одно общее поле.
Виртуальное наследование для решения проблемы ромбовидного доступа
Виртуальное наследование в обеих промежуточных ветвях даёт D единственный подобъект A. Поэтому obj.h становится однозначным и обозначает одно общее поле.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо продемонстрировать применение виртуального наследования, позволяющего избавиться от неоднозначности при обращении к членам базового класса в случае ромбовидной иерархии.
struct A {
int h;
};
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };
Ответ
Виртуальное наследование в обеих промежуточных ветвях даёт D единственный подобъект A. Поэтому obj.h становится однозначным и обозначает одно общее поле.
struct A { int h = 0; };
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};
D obj;
obj.h = 42;
Общую виртуальную базу инициализирует наиболее производный класс, здесь D. Виртуальное наследование и виртуальные функции — разные механизмы. Оно устраняет дублирование базы, но не автоматически разрешает любые конфликты одноимённых членов B и C; конкретные накладные расходы зависят от ABI.