在很多描述虚拟基类用法的教程中(通常用来解决菱形问题),往往会有类似这种结构设计的代码:
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";
}
};
当我创建 Fox 的实例时,我得到了预期的输出,只创建了一个 Animal:
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
如您所见,我虚拟继承了两个第 2 层类。现在,如果只有一个2 层类是虚拟继承的,而另一个是公开继承的,就会出现有趣的输出。例如,如果 FourLegs 是继承 public 而 Mammal 是继承 virtual public,则输出如下:
Creating Animal
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
这很奇怪,并提出了一个问题:在继承树的某个地方创建一个涉及虚拟继承的类的完整过程是什么?
另一方面,如果我 FourLegs 如果继承了 virtual public,并且 Mammal 是继承了 public,那么输出是正常的(好像没有继承 virtual public):
Creating Animal
Creating FourLegs
Creating Animal
Creating Mammal
Creating Fox