При множественном наследовании базовый класс не может быть задан в производном классе более одного раза. На практике возникает ситуация, когда производный класс будет содержать несколько копий одного базового класса. Чтобы избежать многократного включения в производный класс компонент базового класса, используется виртуальное наследование.
Рис. 1.  
При виртуальном наследовании производный класс описывается так:
сlass <имя производного класса>:
virtual <вид наследования> <имя базового класса>
{...};
Включение в производный класс полей базового класса осуществляется один раз, а их инициализация происходит в производном классе, который не является прямым потомком базового класса. Вызов конструкторов при этом происходит в следующем порядке:
Деструкторы вызываются в обратном порядке.
Виртуально наследованный класс должен содержать конструктор без параметров. Он активизируется при выполнении конструкторов классов, являющихся прямыми потомками виртуально наследованного класса.
Пример 1
class fixed
{
protected:

int fix;

public:
fixed(void) /* конструктор без параметров */
{ cout<<” вызов конструктора \n”;}
fixed(int fix)::fix(fix) /* конструктор с параметром */
{ cout<<” вызов конструктора fixed int \n”;}
};

class derived_1: virtual public fixed /* виртуальное наследование */
{
public:

int one;

derived_1(void) { cout<<”Вызов конструктора 1 \n”;};
};

class derived_2: virtual public fixed /* виртуальное наследование */
{
public:

int two;

derived_2(void) { cout<<” Вызов конструктора 2 \n”;};
};

class derived: public derived_1, public derived_2 /* объявление производного класса непрямого потомка */
{
public:

derived(void) {cout<< “вызов конструктора derived” <<endl;}

derived(int fix);

fixed(fix) { cout<<”вызов конструктора derived int“<<endl;}
void out() { cout<<”Fix = ”<< fix; }