Алмазная проблема с интерфейсами - PullRequest
0 голосов
/ 14 января 2011

Я использую много абстрактных классов, которые определяют только чисто виртуальные функции плюс виртуальный (не чистый) деструктор.

Можно ли по-прежнему иметь структуру наследования алмазов без использования виртуального наследования?(Я хотел бы убедиться, что проблем нет, даже если какой-то программист не знает, что ему следует использовать виртуальное наследование.) Какой хороший ресурс дает краткий, но полный обзор этой темы?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Виртуальное наследование - это механизм, с помощью которого вы получаете бриллиант - если вы не используете виртуальное наследование, тогда у вас две разные копии общего базового класса - который на самом деле уже не бриллиант и, вероятно, не тот, который вы хотите.

5 голосов
/ 14 января 2011

Вы не можете. Без виртуального наследования граф наследования просто не является ромбом. Если Derived наследуется от Left и Right, и оба являются не виртуальными производными от Base, тогда будет два Base подобъекта на Derived объект.

2 голосов
/ 14 января 2011

Этот часто задаваемый вопрос дает хорошие ответы на множественное наследование с примерами.

Для алмаза вам необходимо иметь виртуальное наследование.

...