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

Diamond Inheritance Lowest Base Class Constructor

本文关键字:基类 构造函数 继承 钻石      更新时间:2023-10-16

代码如下:

守则 :

#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.)如果实例化了未知类,我将如何初始化所有超类?由于只会创建一个动物实例,我怎样才能避免mysef不得不调用它的构造函数两次?

谢谢

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

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