Подтвердить что ты не робот

Виртуальное наследование

В чем смысл "виртуального" наследования?

Я видел следующий код и не понимал значения ключевого слова virtual в следующем контексте:

class A {};
class B : public virtual A;
4b9b3361

Ответ 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