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

car*_*995 8 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
};
Run Code Online (Sandbox Code Playgroud)

问题:

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

谢谢

Jam*_*lis 13

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

构造Unknown对象时,既Fish不会也Bird不会调用Animal构造函数. Unknown将调用Animal虚拟基础的构造函数.