Процесс создания класса, который включает в себя виртуальное наследование

Во многих учебниках, описывающих использование виртуальных базовых классов (обычно используемых для решения проблемы алмаза), они часто имеют код, похожий на дизайн этой структуры:

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
6
задан ZERO 24 June 2012 в 21:27
поделиться