Во многих учебниках, описывающих использование виртуальных базовых классов (обычно используемых для решения проблемы алмаза), они часто имеют код, похожий на дизайн этой структуры:
class Animal
{
public:
Animal()
{
cout << "Creating Animal\n";
}
};
///////////////////////////
class FourLegs : virtual public Animal
{
public:
FourLegs()
{
cout << "Creating FourLegs\n";
}
};
///////////////////////////
class Mammal : virtual public Animal
{
public:
Mammal()
{
cout << "Creating Mammal\n";
}
};
///////////////////////////
class Fox : public FourLegs, public Mammal
{
public:
Fox()
{
cout << "Creating Fox\n";
}
};
Когда я создаю экземпляр Фокс, я получаю ожидаемый результат, создано только одно животное:
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
Как вы можете видеть, у меня есть два класса уровня 2, которые наследуются виртуально. Теперь, если только одинкласс уровня 2 наследуется виртуально, а другой наследуется публично, могут возникнуть интересные результаты. Например, если FourLegs является унаследованным общедоступным, а Mammal унаследованным виртуальным общедоступным, вывод будет следующим:
Creating Animal
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
Это странно и вызывает вопрос: Каков полный процесс создания класса, который где-то включает виртуальное наследование? в дереве наследования?
С другой стороны, если я FourLegs, если унаследован виртуальный публичный доступ, а млекопитающий наследуется публичный, то вывод будет таким же нормальным (как если бы виртуальный публичный доступ не был унаследован):
Creating Animal
Creating FourLegs
Creating Animal
Creating Mammal
Creating Fox