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

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

19.05.2021, 20:21. Показов 6476. Ответов 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
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 15:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
инициализация базового класса производится в конструкторе most-derived класса
То есть речь идёт о виртуальном наследовании?
Цитата Сообщение от Genidit Посмотреть сообщение
Извините, но я совершенно недостаточно опытен чтобы участвовать в таких дискуссиях
но достаточно опытен, чтобы применять виртуальное наследование? Genidit, в теме это плохо видно. Положите код который вы получили в итоге. Не нужен полный контент, - положите полупустые классы в которых лишь конструктора, инит листы, то есть то что имеет отношение к теме. Навродь:
C++
1
2
3
4
5
6
7
8
9
10
class Base
{ 
               Base(/*...args...*/);
};
class A:public virtual Base
{
              A(/*...args+somthing else...*/):Base(/*...args...*/){}
 
};
//и т.д.
или как-то ещё (учитывая то как вы задаёте аргументы).
Иначе трудно понять.
0
3 / 3 / 0
Регистрация: 29.04.2021
Сообщений: 14
23.05.2021, 16:06  [ТС]
being.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
#include <string>
class being
{
public:
    being();
    being(int S, int E, int I, int D, float HP, float MR, float PR, float AD, bool DTP);
    // ...
    // здесь объявления переменных
    // ...
};
being.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "Being.h"
#include <iostream>
 
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;
}
being::being()
{
    // ...
        // здесь этим же переменным присваивается 0
        // ...
}
monsterlike.h
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "Being.h"
class monsterlike : virtual public being
{
public:
    monsterlike() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
    monsterlike(int M, int A);
    //... 
};
monsterlike.cpp
C++
1
2
3
4
5
6
#include "Monsterlike.h"
#include <iostream>
monsterlike::monsterlike(int M, int A) {
    this->minions            = M;
    this->animanlIstinct   = A;
}
humanlike.h
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include "Being.h"
class humanlike : virtual public being
{
public:
    humanlike() : being(5, 5, 20, 8, 80, 25, 15, 20, true) {}
    humanlike(int L, int C, int M);
    //...
};
humanlike.cpp
C++
1
2
3
4
5
6
#include "Humanlike.h"
humanlike::humanlike(int L, int C, int M){
    this->luck     = L;
    this->charisma = C;
    this->money    = M;
}
ogr.h
C++
1
2
3
4
5
6
7
#pragma once
#include "Monsterlike.h"
class ogr : virtual public monsterlike
{
public:
    ogr() : being(30, 12, 6, 8, 130, 16, 25, 30, true), monsterlike(10, 10) {}
};
human.h
C++
1
2
3
4
5
6
7
#pragma once
#include "Humanlike.h"
class human : virtual public humanlike
{
public:
    human() : being(5, 5, 30, 12, 90, 40, 15, 20, false), humanlike(35, 35 , 550) {}
};
vorgen.h
C++
1
2
3
4
5
6
7
#pragma once
#include "Ogr.h"
#include "Human.h"
class vorgen : virtual public ogr, virtual public human
{
    vorgen() : being(25, 25, 25, 25, 105, 20, 25, 25, true), monsterlike(1, 12), humanlike(10, 20, 200) {}
};
Всё работает.

В ogr.cpp, human.cpp и vorgen.cpp ничего важного.

Цитата Сообщение от IGPIGP Посмотреть сообщение
но достаточно опытен, чтобы применять виртуальное наследование?
Хм, я просто добавил слова virtual.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 16:19
Цитата Сообщение от Genidit Посмотреть сообщение
Хм, я просто добавил слова virtual.
Теперь видно, - спасибо)
0
23.05.2021, 21:10

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть речь идёт о виртуальном наследовании?
Разве я не сказал об этом сразу?
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. "интерферировать" все будет в соответствии с правилами "интерферирования" для виртуального наследования.

0
23.05.2021, 22:06

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Разве я не сказал об этом сразу?
вы говорите так будто я вас чем-то обидел? Я не делал этого. DrOffset, покажите, где вы это говорили.
Мне кажется (может именно мне и именно кажется, но) именно сейчас стало ясно то, как название топика связано с кодом и реакцией компилятора.

0
23.05.2021, 22:16

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
вы говорите так будто я вас чем-то обидел?
Это вам кажется.

Цитата Сообщение от IGPIGP Посмотреть сообщение
покажите, где вы это говорили.
Можно нажать на синий квадратик с двумя стрелками вправо на приведенной выше цитате.

Цитата Сообщение от IGPIGP Посмотреть сообщение
именно сейчас стало ясно то, как название топика связано с кодом и реакцией компилятора.
Ну лично мне это было ясно почти сразу.

0
23.05.2021, 22:19

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Можно нажать на синий квадратик с двумя стрелками вправо на приведенной выше цитате.
выше это где?

0
23.05.2021, 22:20

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
выше это где?
В #25, там где я процитировал себя.

0
23.05.2021, 22:22

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
В #25, там где я процитировал себя.
в моём браузере нет ни чего похожего на ссылку. Похоже мы видим темы совершенно иначе.

0
23.05.2021, 22:26

Не по теме:

IGPIGP,

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 22:31
DrOffset, 25 это вообще мой пост. Я завтра зайду, посмотреть на результаты. Может вы приведёте ссылку вместо неявного указания мне моей тупости. Заодно замечу что я таки тупой. Но участь многих (не буду показывать пальцем) совсем грустна, если пытаться сравнивать.
0
23.05.2021, 22:45

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Может вы приведёте ссылку вместо неявного указания мне моей тупости.
Вы наверное мне не поверите, т.к. я вижу, что у вас крайне больное самолюбие, но я ни на чью "тупость" ни явно, ни неявно не указывал. Картинку я показал, чтобы дать понять как я вижу сообщения на форуме, только и всего.
Никакой агрессии в моих постах нет. Если вам почему-то кажется, что она есть, то я сожалею об этом, но ничего со своей стороны поделать не смогу.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 23:05
Цитата Сообщение от DrOffset Посмотреть сообщение
Никакой агрессии в моих постах нет.
DrOffset, почему всё сводится к агрессии? Агрессия это один из случаев. Но вот такая формулировка, предполагает некоторое раздражение, по крайней мере.
Цитата Сообщение от DrOffset Посмотреть сообщение
Разве я не сказал об этом сразу?
Это как если бы я спросил, ... Не буду.
Просто дайте ссылку на пост где вы сказали о виртуальном наследовании и в теме стало ясно (тут 2К просмотров уже и почти половина вообще впервые тут, возможно) что речь именно о нём.
Цитата Сообщение от DrOffset Посмотреть сообщение
В #25, там где я процитировал себя.
Повторю. #25 это мой пост. Вы там физически не могли цитировать.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.05.2021, 23:12
Цитата Сообщение от IGPIGP Посмотреть сообщение
овторю. #25 это мой пост. Вы там физически не могли цитировать.
Имел в виду #24.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Просто дайте ссылку на пост где вы сказали о виртуальном наследовании и в теме стало ясно
https://www.cyberforum.ru/post15515066.html

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
предполагает некоторое раздражение, по крайней мере.
Нет. Это было недоумение.
Раздражение было бы, если бы я употребил слово "вообще-то", вместо "разве".

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 23:26
Думаете: текста:
Цитата Сообщение от Genidit Посмотреть сообщение
Мне нужно сделать так чтобы я мог присвоить другие какие-либо свои значения в конструкторах родительского (being) и дочернего (monsterlike) в 2-м дочернем классе (ogr). Я уже разузнал что это можно сделать только через виртуальное наследование, исправил и там где надо добавил слово virtual.
достаточно, для того чтобы читать эту тему?
А я не согласился изначально. И теперь есть код поста #22, который всё ставит на места. Теперь ясно в чём была ошибка. Последний класс применил множественное наследование.
И я писал в #18 (сонете)
Цитата Сообщение от IGPIGP Посмотреть сообщение
И как (это же не множественное наследование) будут работать неявный вызов конструктора наследника и его явный вызов в общем списке инициализации. Где-то описана эта "магия"?
Именно потому, что кода не было. А вот что было:
Цитата Сообщение от Genidit Посмотреть сообщение
C++
1
2
3
public:
ogr() : being(15, 10, 5, 8, 100, 15, 25, 25, true) {}
 ogr() : monsterlike(3, 30) {}
Вся тема решалась бы текстом поста #22. А мы продолжаем диспут о том, как ванговать правильно, а как - не прильно.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет. Это было недоумение.
Это не факт. Давайте оставим. Разве это однозначно, доброжелательно употреблять "разве" в подобном случае ?

Добавлено через 2 минуты
Часть текста вначале опять исчезла. Надоело.
0
23.05.2021, 23:26

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Давайте оставим. Разве это однозначно, доброжелательно употреблять "разве" в подобном случае ?
Зачем этот вопрос, если вы "оставить" хотите?
Так мы "оставим" или мне отвечать на вопрос?

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.05.2021, 23:35
Я вас переспросил в ответ на #25 и вы отослали меня к #25. То есть это начало звучать с момента когда я спросил.
вот это (или что-то в этом роде) было вначале предыдущего поста, но исчезло. Что за глюки?
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем этот вопрос, если вы "оставить" хотите?
Так говорят в России когда предлагают оставить. DrOffset, это похоже на наш ход по кругу где я попросил пояснить 25-пост и вы послали меня в 25 тпост со словами недоумения (пусть недоумения, этого вполне достаточно для ответного недоумения ).
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.05.2021, 00:01
IGPIGP,
1) Про #25 чуть выше дал понять, что это была опечатка. Имелся в виду мой пост #24.

2) У меня ничего не глючит.

3) Если у вас форум глючит, и вы это уже поняли, то наверное не стоит недоумевать насчет того, что я недоумеваю, по поводу того вы что-то пропустили в моих словах. Я же не знал, что у вас какие-то технические проблемы с отображением страниц. Теперь я понял, что вы не увидели моих слов из-за глюков форума. Этого достаточно, я снимаю свое недоумение с повестки дня и предлагаю его больше не обсуждать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.05.2021, 01:22
Цитата Сообщение от DrOffset Посмотреть сообщение
Про #25 чуть выше дал понять, что это была опечатка. Имелся в виду мой пост #24.
DrOffset, когда выражается недоумение, то дать понять можно лишь тому кто рад взять. Я не ждал извинений, но как выяснилось вы ссылались на текст который находится в ошибочно предоставленной ссылке, а тот что в правильной и сам ссылается на текст уже не ваш, а ТС и связан с употреблением слова "виртуальный". Это был не ваш текст а ТС, как я уже сказал. Я его видел и не понял. Тут же не я один зраю что "виртуальный" применяется не только для устранения копий при ромбовидном, множественном наследовании. А у ТС было объявление пары конструкторов одинаковой сигнатуры и код ошибки
Цитата Сообщение от Genidit Посмотреть сообщение
Код - C2535
который наводил на мысль о том, что это о нарушении ODR. Я задавал вопрос и получил ответ лишь от ТС в #22. Это прояснило суть. Но вызвало недоумение уже у меня. Я не горжусь тем, что мне удалось его скрыть. Это просто нормально. Просто констатирую.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если у вас форум глючит, и вы это уже поняли, то наверное не стоит недоумевать насчет того, что я недоумеваю
Я сам решу, этот вопрос, так как он мой и больше ни чей.
Цитата Сообщение от DrOffset Посмотреть сообщение
я снимаю свое недоумение с повестки дня и предлагаю его больше не обсуждать
Это же не вопрос на собрании и не транспарант. Если вам угодно можете и снять, тем не менее. DrOffset, в ответ на вопрос вы раз 5 делали вид, что он не о чём. Потом оказалось, что отвечали вы с ошибкой. Ссылка не та. Снимайте. Это ваше право.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.05.2021, 01:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
в ответ на вопрос вы раз 5 делали вид, что он не о чём.
Не было такого. Кроме того, что я ошибся в ссылке на пост (сказал 25, вместо 24), обвинить меня не в чем.


Т.о.
Выше в #24 я сказал, что в посте #17 я уже упомянул о том, что ТС использует виртуальное наследование. Вы пост #17 видели?
Если да, то мое недоумение было оправдано.
Если нет, то мое недоумение было не оправдано, но я об этом тогда еще не знал, потому что не знал что у вас глючит форум.

Собственно все. Больше тут не о чем говорить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2021, 01:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru