Многоуровневое наследование в C ++ - Ошибка вызова базового конструктора - PullRequest
0 голосов
/ 31 января 2019

Итак, у меня довольно сложная программа, в которую я не хочу сейчас углубляться.Я включу игрушечный пример того же процесса, а затем рассмотрю его более подробно.

В моей программе я сталкиваюсь с ошибкой constructor for 'Hunter' must explicitly initialize the base class 'WorldObject' which does not have a default constructor с многоуровневым наследованием: WorldObject -> Creature -> Hunter.

Чтобы воссоздать ту же структуру, я сделал следующее:

class Base
{
protected:
    int a;
public:
    Base(int a): a(a) { print("Base contructed"); }
    ~Base() { print("Base destroyed"); }
    virtual void printData() = 0;
};



class Derived1 : public Base
{
protected:
    int b;
public:
    Derived1(int a, int b): b(b), Base(a) { print("Derived1 contructed"); }
    ~Derived1() { print("Derived1 destroyed"); }
};


class Derived2 : public Derived1
{
protected:
    int c;
public:
    Derived2(int a, int b, int c) : c(c), Derived1(a, b) { print("Derived2 contructed"); }
    ~Derived2() { print("Derived2 destroyed"); }
    virtual void printData(){ //... }
}; 

Здесь конструктор класса Derived2 создал Derived1 через список инициализаторов, а это, в свою очередь, создает Base "косвенно".Это работает, как я ожидал.

Однако в моем сложном коде класс Hunter должен явно вызывать конструктор WorldObject.Это выглядит следующим образом:

Hunter(sf::Texture &texture, float x, float y, sf::Font& font) : 
        WorldObject(texture,x, y, font),
        Creature(texture, x, y, font)
    { //... }

Здесь конструктор Creature просто передает каждый аргумент в конструктор WorldObject.У WorldObject есть только этот конструктор:

WorldObject(sf::Texture& texture, float x, float y, sf::Font& font) : m_sprite(texture)
{ //... }

, а используемый конструктор Creature выглядит следующим образом:

    Creature(sf::Texture &texture, float x, float y, sf::Font& font) : 
    WorldObject(texture, x, y, font), 
    NN(n_input_units, n_hidden_units, n_output_units)
{ //... }

Почему мне нужно инициализировать и WorldObject, и Creature непосредственно в моей Программе, но вНа игрушечном примере это работает без явного конструктора Base?

((Прекомпилятор также жалуется, что для WorldObject нет конструктора по умолчанию, и при компиляции появляется вышеуказанная ошибка))

1 Ответ

0 голосов
/ 31 января 2019

Полагаю, что в вашем сложном коде Hunter напрямую наследуется от WorldObject, а не косвенно через Creature.Если Creature наследует WorldObject, никогда не потребуется Hunter для передачи каких-либо параметров в WorldObject.

...