У меня есть запрос относительно виртуального базового класса. Чтобы решить проблему «страшного алмаза смерти» / неоднозначности в множественном наследовании, введен виртуальный базовый класс.
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 {};
Если ваше наследство не virtual
затем A
участники будут присутствовать дважды в D
учебный класс.
Если A
было поле с именем _a
, затем в D
, пишу B::_a
или же C::_a
будет относиться к двум разным зонам памяти. Если ваше наследство virtual
тогда у вас есть только одна зона памяти.
Если вы используете виртуальный чем не будет никакой двусмысленности при звонке foo()
используя экземпляр Class D
, и если вы не используете виртуальный, то это будет неоднозначность ..
Но будьте осторожны, виртуальное наследование стоит дороже, поэтому используйте его осторожно.
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