Виртуальное наследование от базового класса


AFAIK, виртуальное наследование решает проблему алмаза, но что, если я использую виртуальное, чтобы просто наследовать от базового класса? В чем разница с использованием virtual здесь?

class A 
{
    /* ... */
};

class B : virtual public A
{
    /* ... */
};
1 2

1 ответ:

Есть несколько отличий. Расположение объектов будет отличаться (в случае виртуального наследования в производном подобъекте будет дополнительный скрытый указатель на базу), инициализация подобъектов будет отличаться (тип, производный от B, должен будет вызывать конструктор A непосредственно в списке инициализации). Любой код в функциях-членах B, который ссылается на A - члены (данные или функции), потребует дополнительного косвенного обращения (через указатель, упомянутый выше), и возможно, есть и другие отличия.

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

Подсказка: если вы хотите понять детали того, как виртуальное наследование обрабатывается компилятором, вы должны сосредоточиться на компоновке памяти объектов. Как только вы поймете, почему дополнительный указатель на класс, который практически это необходимо, остальное просто.