Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14

Использование косвенного невиртуального базового класса не допускается

19.05.2021, 20:21. Показов 6462. Ответов 47

Студворк — интернет-сервис помощи студентам
Есть родительский класс being, есть дочерний monsterlike, есть дочерний класс образовавшийся от этого дочернего ogr. Для переменных в род. классе создан конструктор чтобы можно было их инициализировать в дочерних классах, чтобы не повторять их каждый раз. С 1-м доч. классом та же история. Однако в 2-м доч. клас. возникла ошибка с конструктором род. класса которую я написал в названии темы. При этом с конструктором 1-го доч. класса всё в порядке. Спросил у знакомого опытного программиста, он сказал "присваивай значения только в главном классе, а в доч. просто подставляй под них всё что нужно". Но мне кажется это не то что мне нужно, да и сомневаюсь что так будет удобно для дальнейшего исп. программы.

being.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#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 подсвечивается красным и выдает соответствующую ошибку)
C++ (Qt)
1
2
3
4
5
6
7
#include "Monsterlike.h"
class ogr : public monsterlike
{
public:
    ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
    ogr() : monsterlike(3, 30) {}
};
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.05.2021, 20:21
Ответы с готовыми решениями:

Не допускается использование абстрактного типа класса
class Comparator { public: virtual bool operator()(Banner* lh, Banner* rh) const = 0; virtual bool met(Banner *obj) const = 0; ...

Использование метода из наследованного класса к объекту базового класса
Есть метод public void OpExp() { if (Person._age<18) Console.WriteLine("Вы не можете...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

47
2738 / 1663 / 267
Регистрация: 19.02.2010
Сообщений: 4,396
19.05.2021, 21:26
Цитата Сообщение от Genidit Посмотреть сообщение
org.h (здесь being подсвечивается красным и выдает соответствующую ошибку)
замени being на monsterlike
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2021, 00:16
Лучший ответ Сообщение было отмечено Genidit как решение

Решение

Цитата Сообщение от Genidit Посмотреть сообщение
monsterlike() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
параметры передают через конструктор:
C++
1
2
monsterlike(int S, int E, int I, int D, float HP, float MR, float PR, float AD, bool DTP) 
: being(S, E, I, D, HP, MR, PR, AD, DTP) {}
теперь в огре можно пробросить параметры как уже сделано в монстроподобном, но в паре огр-монст.

Добавлено через 11 минут
Genidit, а использование невиртального наследования при попытке динамического кастования или динамического определения типа может вызвать ошибку (вызовет обязательно) . Определите виртуальный метод (и деструктор).
1
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
20.05.2021, 19:07  [ТС]
IGPIGP
Если я вставляю этот код (где параметры передаются через конструктор) то выскакивают ошибки "недопустимый тип для битового поля", "требуется идентификатор", "идентификатор "X" не определен".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2021, 21:54
Цитата Сообщение от Genidit Посмотреть сообщение
Если я вставляю этот код
Genidit, боюсь даже представить... Вы показали объявления но не показали определений. Код где вы получили первую ошибку - использование классов (где-то в main возможно) тоже отсутствовал. Реагируете вы с приличной задержкой. Надо что-то изменить в подходе к теме или решение не придёт в этом месяце.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
21.05.2021, 00:18
Цитата Сообщение от Genidit Посмотреть сообщение
org.h (здесь being подсвечивается красным и выдает соответствующую ошибку)
C++ (Qt)
1
2
3
4
5
6
7
#include "Monsterlike.h"
class ogr : public monsterlike
{
public:
    ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
    ogr() : monsterlike(3, 30) {}
};
Что здесь пытались реализовать??? У класса не может быть два конструктора по умолчанию.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.05.2021, 10:48
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
не может быть
А и правда) Похоже, ТС решил что двоеточие работает как оператор разрешения имён. Нужно что-то менять в подходе.
0
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
22.05.2021, 17:20  [ТС]
Простите, видимо я не правильно сформулировал свой изначальный вопрос. Мне нужно сделать так чтобы я мог присвоить другие какие-либо свои значения в конструкторах родительского (being) и дочернего (monsterlike) в 2-м дочернем классе (ogr). Я уже разузнал что это можно сделать только через виртуальное наследование, исправил и там где надо добавил слово virtual. Теперь первый конструктор :
C++
1
ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
работает нормально и не выдает ошибки.
Однако теперь компилятор жалуется на второй конструктор:
C++
1
ogr() : monsterlike(3, 30) {}
"ogr::ogr(void) функция-член уже определенна или объявлена".
Как подсказали выше, я пытаюсь здесь сделать 2 конструктора по умолчанию, что является ошибкой, но как сделать по другому здесь не знаю.
По поводу файлов реализации (только фрагменты с реализацией конструкторов):
being.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
being::being()
{
    this->strength = 0;
    this->endurance = 0;
    this->intelligence = 0;
    this->dexterity = 0;
    this->healthPoint = 0;
    this->magicResist = 0;
    this->physicalResist = 0;
    this->atackDamage = 0;
    this->damageTypePhysical = true;
}
being::being(int S, int E, int I, int D, float HP, float MR, float PR, float AD, bool DTP)
{
    this->strength = S;
    this->endurance = E;
    this->intelligence = I;
    this->dexterity = D;
    this->healthPoint = HP;
    this->magicResist = MR;
    this->physicalResist = PR;
    this->atackDamage = AD;
    this->damageTypePhysical = DTP;
}
monsterlike.cpp
C++
1
2
3
4
5
monsterlike::monsterlike(int M, int A)
{
    this->minions = M;
    this->animanlIstinct = A;
}
ogr.cpp пустой.
main пустой.
(не буквально естественно а в том плане что там нет ничего чтобы могло вызвать ошибку)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.05.2021, 17:52
Цитата Сообщение от Genidit Посмотреть сообщение
ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
Genidit, вы не прочли что я написал. И не показываете код где получили ошибку (тоже не читали). Видимо у вас есть время.
1
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
22.05.2021, 17:56  [ТС]
Код - C2535
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.05.2021, 19:39
Цитата Сообщение от Genidit Посмотреть сообщение
Код - C2535
вот же
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У класса не может быть два конструктора по умолчанию.
два объявление функции в одной области. Если это мелкомягкий код. Но я другое имел ввиду. Созревайте.
1
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
22.05.2021, 20:16  [ТС]
Как тогда мне задать значения в
C++
1
monsterlike(3, 30)
?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 01:18
Цитата Сообщение от Genidit Посмотреть сообщение
Как тогда мне
Да.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.05.2021, 01:51
Лучший ответ Сообщение было отмечено Genidit как решение

Решение

Цитата Сообщение от Genidit Посмотреть сообщение
Как тогда мне задать значения
C++
1
    ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true),  monsterlike(3, 30)  {}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 04:41
DrOffset, в конструкторе
Цитата Сообщение от Genidit Посмотреть сообщение
C++
1
monsterlike(int M, int A);
должен вызваться ведь какой-то конструктор beng (реализация не показана и не ясно, какой из конструкторов, но скорее всего - по умолчанию). Как же это всё будет интерферировать?
1
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
23.05.2021, 08:47  [ТС]
DrOffset, Спасибо, сработало. IGPIGP, и вам спасибо тоже.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.05.2021, 13:01
Цитата Сообщение от IGPIGP Посмотреть сообщение
должен вызваться ведь какой-то конструктор beng (реализация не показана и не ясно, какой из конструкторов, но скорее всего - по умолчанию). Как же это всё будет интерферировать?
Мой ответ исходит из слов автора:
Цитата Сообщение от Genidit Посмотреть сообщение
Я уже разузнал что это можно сделать только через виртуальное наследование, исправил и там где надо добавил слово virtual.
Т.е. "интерферировать" все будет в соответствии с правилами "интерферирования" для виртуального наследования.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 13:31
Цитата Сообщение от DrOffset Посмотреть сообщение
Мой ответ исходит из слов автора:
Я пытался выяснить код, но получил код ошибки. А видя то что ТС написал я понял, что человек узнает о классах когда начнёт многопоточное программирование на С++ практиковать.
Но я не понял, зачем параметры родителей не проводятся через параметры наследников. Почему нужно хардкодить значения когда можно задать по умолчанию если нужно. И как (это же не множественное наследование) будут работать неявный вызов конструктора наследника и его явный вызов в общем списке инициализации. Где-то описана эта "магия"? Я понимаю, что можно разрешить компилятору выбрать явный вызов конструктора (по записи). Просто не встречал такого и не знаю где это может быть необходимо (от слова нельзя обойти другим путём). Потому как мне неизвестны случаи когда нормальной проводкой аргументов через параметры по иерархии нельзя что-то сделать. Вот и хочется понять.
DrOffset, тема имеет достаточно разумное название ( сообщение компилятора ) и приведёт к росту популярности. Но выиграет ли форум от того как она раскрыта? Поэтому и спрашиваю.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.05.2021, 13:59
IGPIGP, это всё не ко мне вопросы.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Где-то описана эта "магия"?
При виртуальном наследовании инициализация базового класса производится в конструкторе most-derived класса. Это вроде бы всем известный факт.

А вопросы про целесообразность тут виртуального наследования в принципе надо задавать, я повторюсь, не мне, а автору темы.
0
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
23.05.2021, 15:10  [ТС]
Извините, но я совершенно недостаточно опытен чтобы участвовать в таких дискуссиях, так как могу наговорить испанского стыда, мне всего лишь нужно было решить мой вопрос, вы помогли его решить и всё. Это раздел C++ для начинающих.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2021, 15:10
Помогаю со студенческими работами здесь

Как создать динамический массив объектов базового класса и заполнить его наследниками базового класса?
#include <iostream> using namespace std; class P { int p; public: P() {

Использование конструктора базового класса наследником
Доброго дня, коллеги! Решал одну задачку и столкнулся с проблемой. По условию дан класс String, моделирующий работу типа данных string....

Использование переменных базового класса в дочернем классе
Доброго времени суток. Подскажите пожалуйста как в классе SumbString работать с переменными(string s;int z ; ) класса factory ? Мне...

Использование в производных классах методов базового класса с другой сигнатурой
Вопрос можно и как-то шире ставить наверное. Суть в чем. Есть базовый класс. У него есть классы потомки. При этом известно, что у...

Использование конструктора базового класса при динамическом выделении памяти
Есть базовый класс, от него наследуются несколько классов, свой конструктор я определил в базовом классе. Далее нужно сделать так:parent...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru