我正在尝试继承,我遇到了一个特定的行为。首先,看一下代码:
class animal
{
public:
int ID;
animal(int id) : ID(id)
{
cout<<"I am an animal and I am not a terrorist. Here is my ID: "
<<ID<<endl;
}
};
class lion : virtual public animal
{
public:
lion(int id) : animal(id)
{
cout<<"I am a lion and I am not a terrorist. Here is my ID: "
<<ID<<endl;
}
};
class tiger : virtual public animal
{
public:
tiger(int id) : animal(id)
{
cout<<"I am a tiger and I am not a terrorist. Here is my ID: "
<<ID<<endl;
}
};
class liger : public lion, public tiger
{
public:
liger(int id) : lion(id), tiger(id), animal(id)
{
cout<<"I am a liger and I am not a terrorist. Here is my ID: "
<<ID<<endl;
}
};
当liger的构造函数为liger(int id) : lion(id), tiger(id), animal(id)...
时
我创建了一个像liger l(444)
这样的对象,然后得到了以下预期输出:
I am an animal and I am not a terrorist. Here is my ID: 444
I am a lion and I am not a terrorist. Here is my ID: 444
I am a tiger and I am not a terrorist. Here is my ID: 444
I am a liger and I am not a terrorist. Here is my ID: 444
然后我将其更改为liger(int id) : lion(55), tiger(55), animal(id)
但它也提供了相同的输出。 现在,我的问题是,如果lion
和tiger
构造函数的参数被忽略,那么它们的目的是什么?
答案 0 :(得分:0)
在虚拟继承中,虚拟基础的构造函数由大多数派生类的构造函数调用,它是您案例中liger
的构造函数。在这种情况下,忽略来自animal(id)
和lion
构造函数的tiger
调用。这是设计的。
原因是,当animal(id)
或tiger
是派生程度最高的类时,您仍然需要致电lion
。
答案 1 :(得分:0)
只有最派生的类实际初始化虚拟基类。换句话说,如果(!)它们不是最衍生的类,则忽略由虎和狮子执行的动物的初始化。