множественное наследование — виртуальный базовый класс в переполнении стека

У меня есть запрос относительно виртуального базового класса. Чтобы решить проблему «страшного алмаза смерти» / неоднозначности в множественном наследовании, введен виртуальный базовый класс.

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

Что будет когда ключевое слово virtual не используется в class C декларация. Не могли бы вы объяснить мне подробно?

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

0

Решение

Если ваше наследство не virtual затем A участники будут присутствовать дважды в D учебный класс.

Если A было поле с именем _a, затем в D, пишу B::_a или же C::_a будет относиться к двум разным зонам памяти. Если ваше наследство virtual тогда у вас есть только одна зона памяти.

3

Другие решения

Если вы используете виртуальный чем не будет никакой двусмысленности при звонке foo() используя экземпляр Class D, и если вы не используете виртуальный, то это будет неоднозначность ..
Но будьте осторожны, виртуальное наследование стоит дороже, поэтому используйте его осторожно.

0

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

Если наследование от класса A до B помечено как виртуальное, а не от класса A до C, то C ++ создаст один виртуальный A (D наследует B, B наследует A) и не виртуальный A (D наследует C, C наследует A). Следовательно, ваш код не решит проблему с бриллиантами:

D d_object;
A &a_ref = d_object; // error raised -> B::A or C::A
0
По вопросам рекламы [email protected]