Итак, у меня есть эта идея, и я думаю, что ее практически невозможно реализовать на C++... но я хочу спросить. Я прочитал главу 15 Страуструпа и не получил ответа, и я не думаю, что миллиард других вопросов о бриллиантах, связанных с наследством, не отвечает на этот, поэтому я спрашиваю здесь.
Вопрос в том, что происходит, когда вы наследуете от двух базовых классов, которые сами имеют общий базовый класс, но только один из двух наследуется от него виртуально. Например:
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
" был объектом класса, который они по существу заменяют, но я хочу, чтобы следующий класс на диаграмме наследования использовал реализацию переопределенного метода из "My
" базового класса, но и все остальные методы из классов библиотеки. Классы библиотеки практически не наследуются, так что вот так
class LibDerived : LibBase
Но если я заставлю свой класс виртуально наследовать
class MyBase : virtual LibBase {};
class MyDerived: virtual MyBase, virtual LibDerived {};
Так как MyDerived
будет иметь виртуальную таблицу, а MyBase
будет иметь виртуальную таблицу, будет ли только один объект LibBase
?
Я надеюсь, что этот вопрос достаточно ясен.