Разбирам и съм чел достатъчно за проблема с диамантите, който се решава чрез виртуално наследяване. Въпросът ми тук е
„Какво всъщност означава поставянето на виртуален до базов клас, от който бихте наследили“
class A { public: void Foo() {} };
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
Исках да знам дали моето разбиране е правилно. В изявлението
class D : public B, public C {}
Компилаторът ще премине през първия базов клас B и ще забележи, че той практически наследява от class A
. Компилаторът ще провери дали екземплярът на клас A присъства, ако не, той ще създаде екземпляр на A, който е извлечен от B. След това компилаторът ще премине през клас C и ще забележи, че той наследява виртуално от клас A. Въпреки това, тъй като е наследен виртуално от C и екземпляр на A вече присъства, той няма да включва нов екземпляр. По този начин проблемът с диаманта се решава. Правилно ли е това разбиране?