Я понимаю и достаточно прочитал о проблеме с бриллиантами, которая решается виртуальным наследованием. Вот мой вопрос
«Что на самом деле означает размещение виртуального рядом с базовым классом, от которого вы унаследуете?»
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 уже присутствует, он не будет включать новый экземпляр. Таким образом решается алмазная проблема. Это понимание правильное?