Насколько важен для вас быстрый доступ к членам данных A? В конечном счете, виртуальное наследование дает вам легкий доступ к A :: a, но за определенную плату почти ко всему остальному в B2 и B1.
Можете ли вы получить желаемый эффект от совместного использования A :: a без использованиябриллиант? В модели COM все классы интерфейса использовали простое наследование, унаследованное от интерфейса IUnknown, но затем классу-экземпляру пришлось реализовать конечную функцию «истинного базового класса», чтобы добраться до «зарегистрированного» IUnknown. Конечно, в этой модели не было элементов данных.
Вы могли бы тривиально настроить B1: public trueA
и B2: public indirectA
, а затем в вашей реализации иметь шаблонную оболочку, которая "активирует" косвенный A, чтобы найти trueA. Вы также можете сделать так, чтобы ваша оболочка реализации была производной от trueA, B1, B2 и зафиксировать в ней как экземпляры косвенного A, так и B1 и B2?
Но обратите внимание, что это полагается на то, что конструкторы для B1 и B2 не ссылаются на A, так как он еще не был инициализирован.
Можно грязно взломать конструктор косвенного А, чтобы «узнать», что он на самом деле создан в С: В2, и вывести С: В1: А или С: А, и вы, вероятно, сможете получить это достаточно чисто, используя шаблонысдвинуть определения, возможно, с небольшим CRTP?