Diamond Inheritance Самый низкий конструктор базового класса

Кодекс выглядит следующим образом:

Код :

#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 придется дважды вызывать его конструктор?

Спасибо

7

Решение

Самый производный класс инициализирует любые виртуальные базовые классы. В вашей иерархии классов, Unknown должен построить виртуальный Animal базовый класс (например, путем добавления Animal(a) в его список инициализации).

При построении Unknown объект, ни Fish ни Bird позвоню Animal конструктор. Unknown вызовет конструктор для Animal виртуальная база.

12

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector