Виртуальное наследование от базового класса
AFAIK, виртуальное наследование решает проблему алмаза, но что, если я использую виртуальное, чтобы просто наследовать от базового класса? В чем разница с использованием virtual
здесь?
class A
{
/* ... */
};
class B : virtual public A
{
/* ... */
};
1 ответ:
Есть несколько отличий. Расположение объектов будет отличаться (в случае виртуального наследования в производном подобъекте будет дополнительный скрытый указатель на базу), инициализация подобъектов будет отличаться (тип, производный от
Виртуальное наследование-это сложный вопрос, и вам, вероятно, следует прочитать больше ссылок, приведенных в ответах на предыдущий ваш вопрос, чем пытаться понять его, просто получая кусочки и фрагменты из отдельных вопросов.B
, должен будет вызывать конструкторA
непосредственно в списке инициализации). Любой код в функциях-членахB
, который ссылается наA
- члены (данные или функции), потребует дополнительного косвенного обращения (через указатель, упомянутый выше), и возможно, есть и другие отличия.Подсказка: если вы хотите понять детали того, как виртуальное наследование обрабатывается компилятором, вы должны сосредоточиться на компоновке памяти объектов. Как только вы поймете, почему дополнительный указатель на класс, который практически это необходимо, остальное просто.