9

代码如下:

编码 :

#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 不得不调用它的构造函数两次?

谢谢

4

1 回答 1

17

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

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

于 2012-09-19T17:55:52.437 回答