初始化列表中二级类构造函数参数的用途

时间:2014-10-03 12:00:45

标签: c++ class inheritance multiple-inheritance virtual-inheritance

我正在尝试继承,我遇到了一个特定的行为。首先,看一下代码:

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)但它也提供了相同的输出。 现在,我的问题是,如果liontiger构造函数的参数被忽略,那么它们的目的是什么

2 个答案:

答案 0 :(得分:0)

在虚拟继承中,虚拟基础的构造函数由大多数派生类的构造函数调用,它是您案例中liger的构造函数。在这种情况下,忽略来自animal(id)lion构造函数的tiger调用。这是设计的。

原因是,当animal(id)tiger是派生程度最高的类时,您仍然需要致电lion

答案 1 :(得分:0)

只有最派生的类实际初始化虚拟基类。换句话说,如果(!)它们不是最衍生的类,则忽略由虎和狮子执行的动物的初始化。