Виртуальное наследование используется при множественном наследовании, когда базовые классы унаследованы от одного общего, для того чтобы данные базового класса были общими
class Base
{
protected:
int i;
};
class A : public Base {};
class B : public Base {};
class C : public A, public B
{
public:
void SetI(int n) { i = n; }
int GetI() { return i; }
};
это не будет компилиться, т.к. класс C содержит две переменные i
class Base
{
protected:
int i;
};
class A : public virtual Base {};
class B : public virtual Base {};
class C : public A, public B
{
public:
void SetI(int n) { i = n; }
int GetI() { return i; }
};
а вот так все ОК