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

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

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

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

person user1086635    schedule 01.01.2012    source источник


Ответы (1)


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

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

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

person David Rodríguez - dribeas    schedule 01.01.2012