【发布时间】:2012-06-26 05:38:45
【问题描述】:
在很多描述虚拟基类用法的教程中(通常用来解决菱形问题),往往有类似这种结构设计的代码:
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 层类。现在,如果只有 一个 tier-2 类是虚拟继承的,而另一个是公开继承的,则可能会出现有趣的输出。例如,如果 FourLegs 是继承 public,而 Mammal 是继承 virtual public,则输出如下:
Creating Animal
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
这很奇怪,提出了一个问题:在继承树的某个地方创建一个涉及虚拟继承的类的完整过程是什么?
另一方面,如果 I FourLegs 如果继承了 virtual public,并且 Mammal 是继承了 public,那么输出是正常的(好像没有继承 virtual public):
Creating Animal
Creating FourLegs
Creating Animal
Creating Mammal
Creating Fox
【问题讨论】:
-
我确信这只是一个例子。然而,继承
FourLegs会很奇怪,因为狐狸有四条腿。 -
这些类的名称并不重要。我只是想了解更多关于虚拟继承的信息。
-
@JesseGood,也许将
FourLegs重命名为FourLegCreatures可以解决问题。 -
现在我知道该找谁来问我的班级应该命名什么了!
-
@ZERO:不只是名字,继承和组合都是很基础的概念,请google
what is the difference between inheritance and composition c++看this question
标签: c++ inheritance diamond-problem