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

Наследование, конструкторы и operator+-*/=

07.07.2023, 13:34. Показов 686. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
class a
{
int ap;
public:
a(){}//нулевой констр.
a(int t):ap(t){}//конструктор с 1 арг.
a operator =(a& per)//оператор присв
{
ap=per.ap;
cout<<" присвоение"<<endl;
return a(ap);
}
a operator +(a& per)//перегруж сложение
{
ap+=per.ap;
return a(ap);
}
void s(){cout<<ap<<endl;}
};
class b: public a
{
public:
b():a(){};
b(int t):a(t){}
};
int main()
{
b b1=4;
b b2;
b2=b1; //"=" присваиван. из базового работает (именно из базового, я фразу на вывод написал там)
b2.s();
b b3;
 b3=b1+b2;// ни хера не работает (b1+b2 также возвращает базу через констр, но в операторе= работает, а тут нет)
b3.s();
}
1. как работает b2=b1 через operator= баз. класса, если не должно(причем именно работает, я там вывод строки для индикации прописал, выводит) Operaror= ,в учебнике написано, не наследуется.
2. почему тогда не работает b3=b1+b2 (ведь выражение возвращает также, как и operator«=» объект базового класса. Конструктора в производном нет, но ведь в первом случае работает итак)
3. operator+ я так понимаю? унаследовать тоже нельзя без добавлений (типа конструктора преобразования или еще чего-то такого типа using, this), потому что возвращает базовый объект
Именно в этом виде хочется понять, как код работает
4. вообще интересует инфо, наследуются ли:
Конструкторы – я понял, что нет (но базовый конструктор, если ничего не переопределено, компилятор предоставляет) Constr b():Constr a(){} – не считается – это не наследование, а вызов
Operator = не наследуется, но вот в примере вопрос выше и возник (можно подумать, что компилятор через дефолтный присваивает, но почему тогда строка-индикатор из базового выходит)
Operator +-*/ не наследуется, по идее (из-за разности возвращаемых типов)
Деструкторы – не наследуются
Это инфо, которое удалось найти в инете. Буду признателен, если кто-то проконсультирует
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2023, 13:34
Ответы с готовыми решениями:

решение задачи Конструкторы и деструкторы, Наследование, Множественное наследование. Полиморфизм
Задания такие Что зачеркнуто вроде сделано правильно) Если есть люди добрые не могли бы вы помочь? Лабораторная работа № 2....

Конструкторы. Наследование
Почему вызов s.display() оказывается пустым? #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;cstring&gt; using namespace...

наследование. конструкторы
#include &lt;iostream&gt; using namespace std; #include &lt;locale&gt; #include &lt;time.h&gt; #include &lt;windows.h&gt; class TArray { ...

9
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.07.2023, 13:44
Цитата Сообщение от Valdemarych Посмотреть сообщение
как работает b2=b1 через operator= баз. класса, если не должно(причем именно работает, я там вывод строки для индикации прописал, выводит) Operaror= ,в учебнике написано, не наследуется.
У b свой собственный сгенерированный компилятором operator=, он и работает (и он работает в данном случае путем вызова operator= для подобъекта базового класса, т.е. для a).

Цитата Сообщение от Valdemarych Посмотреть сообщение
почему тогда не работает b3=b1+b2 (ведь выражение возвращает также, как и operator«=» объект базового класса. Конструктора в производном нет, но ведь в первом случае работает итак)
Потому что присваивание идет для b, а возвращаете вы в operator+ - a. В первом случае к b присваивалось b, а во втором к b присваивается a. В этом разница.
2
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
07.07.2023, 13:47
Цитата Сообщение от Valdemarych Посмотреть сообщение
a operator =(a& per)//оператор присв
{
ap=per.ap;
cout<<" присвоение"<<endl;
return a(ap);
}
стопудово должно быть конце

C++
1
return *this;
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.07.2023, 13:56
Лучший ответ Сообщение было отмечено Valdemarych как решение

Решение

Кроме того, проблема будет из-за отсутствия const в параметре оператора=, потому что operator+ возвращает у вас временный объект, который не привязывается к неконстантной ссылке.

Минимальные исправления для вашего кода:
Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
using namespace std;
class a
{
    int ap;
public:
    a() : ap()
    {}
    a(int t) : ap(t)
    {}
 
    a& operator=(a const& per)//оператор присв
    {
        ap = per.ap;
        cout<<" присвоение"<<endl;
        return *this;
    }
    a operator+(a const& per) const //перегруж сложение
    {
        int tmp = ap;
        tmp += per.ap;
        return a(tmp);
    }
    void s(){ cout<<ap<<endl; }
};
 
class b: public a
{
public:
    b() : a()
    {}
    b(int t) : a(t)
    {}
 
    using a::operator=;
};
int main()
{
    b b1=4;
    b b2;
    b2 = b1;
    b2.s();
    b b3;
    b3 = b1 + b2;
    b3.s();
}


Цитата Сообщение от Valdemarych Посмотреть сообщение
Это инфо, которое удалось найти в инете.
Да почему в инете-то это ищете? Книгу читайте.
Ключевая тема для понимания: "Области видимости и сокрытие имен"
0
0 / 0 / 0
Регистрация: 04.03.2020
Сообщений: 30
07.07.2023, 14:40  [ТС]
Цитата Сообщение от Valdemarych Посмотреть сообщение
Конструкторы – я понял, что нет (но базовый конструктор, если ничего не переопределено, компилятор предоставляет) Constr b():Constr a(){} – не считается – это не наследование, а вызов
Operator = не наследуется, но вот в примере вопрос выше и возник (можно подумать, что компилятор через дефолтный присваивает, но почему тогда строка-индикатор из базового выходит)
Operator +-*/ не наследуется, по идее (из-за разности возвращаемых типов)
Деструкторы – не наследуются
с первыми вопросами разбираюсь. Спасибо!
А есть возможность уточнить, в этих утверждениях я прав?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.07.2023, 14:49
Цитата Сообщение от Valdemarych Посмотреть сообщение
А есть возможность уточнить, в этих утверждениях я прав?
Здесь, в этой теме, в основном дело не в том наследуется ли что-то или нет, а в том что из унаследованных имен оказывается скрытым по тем или иным причинам.
Деструкторы и конструкторы (кроме явного указания через С++11-фичу inherited constructors) не наследуются.
Все остальное - это в основном про сокрытие, а не про наследование.
0
0 / 0 / 0
Регистрация: 04.03.2020
Сообщений: 30
07.07.2023, 14:49  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Да почему в инете-то это ищете? Книгу читайте.
Лафоре читаю-уже дочитываю.)) Много непонятно все равно.
0
0 / 0 / 0
Регистрация: 18.07.2021
Сообщений: 12
07.07.2023, 17:22
b b1=4; - вызывает конструктор b(int t):a(t){}
b b2; - создаёт объект класса b
b2=b1; - для классов, которые не используют new хватает operator= по умолчанию (тема в учебнике: специальные ф-ии-члены)
b2.s(); - s() открытый метод базового класса, наследуется как открытый метод производного класса, с этим okey
b b3; - создаёт объект класса b
b3=b1+b2; - operator+ для класса b не определён

Насчёт специальных ф-ий членов: спец ф-ии-члены определённые по умолчанию в неявном виде вызывают спец ф-ии-члены базового класса.
Не наследуются методы конструктора, деструктор, операция присваивания и
дружественные функции.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.07.2023, 18:02
Цитата Сообщение от Valdemarych Посмотреть сообщение
Operaror= ,в учебнике написано, не наследуется.
В учебнике написано неправильно. Оператор = прекрасно наследуется.

Цитата Сообщение от Valdemarych Посмотреть сообщение
operator+ я так понимаю? унаследовать тоже нельзя без добавлений
Никакого "тоже" тут нет. Оператор + прекрасно наследуется обычным образом.

Цитата Сообщение от Valdemarych Посмотреть сообщение
Конструкторы – я понял, что нет (но базовый конструктор, если ничего не переопределено, компилятор предоставляет) Constr b():Constr a(){} – не считается – это не наследование, а вызов
Operator = не наследуется, но вот в примере вопрос выше и возник (можно подумать, что компилятор через дефолтный присваивает, но почему тогда строка-индикатор из базового выходит)
Operator +-*/ не наследуется, по идее (из-за разности возвращаемых типов)
Деструкторы – не наследуются
Он конструкторах и деструкторах можно говорить, что они "не наследуются" просто потому, что у них нет собственных имен. Про = и + написана ерунда. Все наследуется.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.07.2023, 21:17
Цитата Сообщение от Valdemarych Посмотреть сообщение
в учебнике написано, не наследуется.
Цитата Сообщение от Valdemarych Посмотреть сообщение
Лафоре
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В учебнике написано неправильно.
Процитированное в общем-то очередная характеристика данного учебника.
Лафоре известная книжка с огромным количеством как опечаток так и фактических ошибок.
Иной раз такую чушь пишет автор, что закрадываются сомнения, а понимает ли он вообще преподносимый материал.
Примеры:
https://www.cyberforum.ru/post13748228.html
Неявное преобразование с использованием конструктора с одним параметром
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2023, 21:17
Помогаю со студенческими работами здесь

Наследование, конструкторы
Что не верно в таком объявлении : class P{ public: P(int n); }; class Ch:public P{ public: Ch(int n):P(n); };

Наследование классов и конструкторы
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; class form { public: form(){printf(&quot;form::form()\n&quot;);}; ...

Наследование, конструкторы с параметрами
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;vector&gt; #include &lt;fstream&gt; # define _CRT_SECURE_NO_WARNINGS using...

Делегирующие конструкторы и наследование
Возможно ли использовать делегирующие конструкторы когда нужно инициализировать базовый класс? Например есть два таких конструктора: ...

Конструкторы при множественном наследование
нужно реализовать множественную иерархию классов родословной, исследовать иерархический порядок вызова конструкторов и деструкторов. ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru