Итак, у меня есть эта идея, и я думаю, что это практически невозможно реализовать на C++ ... но я хочу спросить. Я прочитал главу 15 «Страуструп» и не получил ответа, и я не думаю, что на этот вопрос ответим миллиарды других вопросов о алмазах наследования, поэтому я прошу здесь.Асимметричный виртуальный наследование алмаза в C++
Вопрос в том, что происходит, когда вы наследуете от двух базовых классов, которые совместно используют общий базовый класс, но только один из двух наследует от него фактически. Например:
class CommonBase { ... };
class BaseA : CommonBase { ... };
class BaseB : virtual CommonBase { ... };
class Derived : BaseA, BaseB { ... };
Причина, я думаю, что я хочу сделать это, потому что я пытаюсь расширить существующую библиотеку без перекомпиляции целой библиотеки (не хочет, чтобы открыть эту банку с червями). Уже существует цепочка наследования, которую я бы хотел изменить. В основном что-то вроде этого (извините искусство ascii)
LibBase
| \
| \
| MyBase
| |
| |
LibDerived |
| \ |
| \ |
| MyDerived
| |
LibDerived2 |
| \ |
| \ |
| MyDerived2
| |
LibDerived3 |
| \ |
| \ |
| MyDerived3
| |
LibConcrete |
\ |
MyConcrete
Получить картину? Я хочу, чтобы объект каждого из классов «My
» был be объект класса, который они существенно заменяют, но я хочу, чтобы следующий класс на диаграмме наследования использовал реализацию переопределенного метода из «My
» базового класса, но все другие методы из классов библиотеки. Классы библиотеки не наследуют практически так же, как этот
class LibDerived : LibBase
Но если я мой класс наследует практически
class MyBase : virtual LibBase {};
class MyDerived: virtual MyBase, virtual LibDerived {};
С MyDerived
будет иметь виртуальные таблицы, и MyBase
будет иметь виртуальные таблицы, там будет только один LibBase
объект?
Я надеюсь, что этот вопрос достаточно ясен.
Почему бы вам не сделать это?: p – jalf
Как я уже сказал, я хотел бы расширить функциональность библиотеки, создав класс aa, который переопределяет функцию-член класса в библиотеке, но все же объект, который наследует от этого класса, все еще может использоваться библиотекой , Конкретный класс, который я хочу расширить, - это 4 уровня наследования от базового класса, который я хочу изменить. Я вижу, где мне, возможно, придется повторно использовать эту функциональность и в других производных классах, поэтому просто переопределить необходимый метод в моем конкретном классе недостаточно. – cheshirekow