Виртуальное наследование для решения проблемы ромбовидного доступа

Виртуальное наследование в обеих промежуточных ветвях даёт 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.

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

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

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

Подробнее