Я видел следующий код и не понимал значения ключевого слова virtual в следующем контексте:
class A {};
class B : public virtual A;
Ответ 1
Виртуальное наследование используется для решения проблемы DDD (Dreadful Diamond при деривании).
Посмотрите на следующий пример, где у вас есть два класса, которые наследуются от одного и того же базового класса:
class Base
{
public:
virtual void Ambig();
};
class C : public Base
{
public:
//...
};
class D : public Base
{
public:
//...
};
Теперь вы хотите создать новый класс, который наследует как из классов C, так и D (которые оба унаследовали функцию Base:: Ambig()):
class Wrong : public C, public D
{
public:
...
};
Пока вы определяете класс "Неверный" выше, вы фактически создали DDD (проблема деривации алмаза), потому что вы не можете позвонить:
Wrong wrong;
wrong.Ambig();
Это неоднозначная функция, потому что она определена дважды:
Wrong::C::Base::Ambig()
и
Wrong::D::Base::Ambig()
Чтобы предотвратить такую проблему, вы должны использовать виртуальное наследование, которое, как известно, будет ссылаться на правильную функцию Ambig().
Итак - define:
class C : public virtual Base
class D : public virtual Base
class Right : public C, public D