Использование косвенного невиртуального базового класса не допускается
Есть родительский класс being, есть дочерний monsterlike, есть дочерний класс образовавшийся от этого дочернего ogr. Для переменных в род. классе создан конструктор чтобы можно было их инициализировать в дочерних классах, чтобы не повторять их каждый раз. С 1-м доч. классом та же история. Однако в 2-м доч. клас. возникла ошибка с конструктором род. класса. При этом с конструктором 1-го доч. класса всё в порядке. Спросил у знакомого опытного программиста, он сказал "присваивай значения только в главном классе, а в доч. просто подставляй под них всё что нужно". Но мне кажется это не то что мне нужно, да и сомневаюсь что так будет удобно для дальнейшего исп. программы.
being.h
class being
{
protected:
std::string Name;
public:
being();
being(int S, int E, int I, int D, float HP, float MR, float PR, float AD, bool DTP);
int strength;
int endurance;
int intelligence;
int dexterity;
float healthPoint;
float magicResist;
float physicalResist;
float atackDamage;
bool damageTypePhysical = true;
void atack(being &being);
void defense();
};
monsterlike.h
#include "Being.h"
#include "Humanlike.h"
class monsterlike : public being
{
public:
monsterlike() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
monsterlike(int M, int A);
int minions = 0;
int animanlIstinct = 10;;
void scream(humanlike &humanlike);
void rabies(humanlike &humalike);
};
org.h (здесь being подсвечивается красным и выдает соответствующую ошибку)
#include "Monsterlike.h"
class ogr : public monsterlike
{
public:
ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
ogr() : monsterlike(3, 30) {}
};
Ответы (1 шт):
Начнем с того, что у вас
ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
ogr() : monsterlike(3, 30) {}
два конструктора по умолчанию, с одинаковой сигнатурой. Компилятор с ума сойдет...
Далее - "вассал моего вассала - не мой вассал" :) - вы должны в конструкторе org() сконструировать предка, а не дедушку. Дедушку будет конструировать предок. Так что тут достаточно вместо первого конструктора написать
ogr() : monsterlike() {}
или даже
ogr() {}
потому что в этом случае у вас все равно будет вызван конструктор предка по умолчанию. А этот конструктор предка по умолчанию как раз и вызывает нужный вам конструктор своего предка:
monsterlike() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
"По-моему, так" (с) Пух