钻石继承最低基类构造函数

时间:2012-09-19 17:53:20

标签: c++ constructor diamond-problem

守则如下:

守则:

#include <iostream>

using namespace std;

class Animal{
   int a;

    public:
    Animal(int a) : a(a){}
    int geta(){return a;}
};

class Bird : virtual public Animal{
    string b;
    public:
    Bird(int a , string b) : Animal(a) , b(b){}
};

class Fish : virtual public Animal{
    int f;
    public:
    Fish(int a , int f) : Animal(a) , f(f){}
};

class Unknown : public Bird, public Fish{
    char u;
    public:
    Unknown(int a , int f , string b , char u )
     : Bird(a , b) , Fish(a , f) , u(u){}  //Problem
};

问题:

1.)如果实例化Unknown类,我将如何初始化所有超类?因为只创建一个Animal实例,我怎样才能避免mysef必须两次调用它的构造函数?

谢谢

1 个答案:

答案 0 :(得分:12)

派生程度最高的类初始化任何虚拟基类。在类层次结构中,Unknown必须构造虚拟Animal基类(例如,通过将Animal(a)添加到其初始化列表中)。

构建Unknown对象时,FishBird都不会调用Animal构造函数。 Unknown将调用Animal虚拟基础的构造函数。