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

Перегрузка оператора << в производном классе

14.06.2022, 14:14. Показов 1296. Ответов 11

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста, как перегрузить оператор << в производном классе.

Базовый класс:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
enum Sex {MALE, FEMALE};
 
class Animal//класс описывающий животное
{
 
protected:
    unsigned int m_age;// возраст
    Sex m_sex;         // пол
    char* m_pName;     // указатель на строку с именем животного
 
public:
    Animal(); // конструктор по умолчанию
    Animal(int age, Sex s, const char* pName=""); // конструктор с параметрами
    Animal(const Animal& other); // конструктор копирования
    Animal(Animal&& other); //mov конструктор копирования
    virtual ~Animal();
 
    Animal& operator=(const Animal& r);
    Animal& operator=(Animal&& other);
 
    friend bool operator == (const Animal&, const Animal&);
    friend std::ostream& operator << (std::ostream& os, const Animal& an);
    
    
    void SetAge(int age)
    {
    
        if (age>=0 && age<30)
        {
            m_age = age;
        }
        else
        {
            std::cout << "Такого не может быть!";
        }
    }
 
    void Grow(int delta)
    {
        if (m_age + delta >= 0 && m_age + delta < 30)
        {
            m_age = m_age + delta;
        }
        else
        {
            std::cout << "Такого не может быть!";
        }
    }
 
    //virtual void Voice()const = 0;
 
    virtual void Voice()const
    {
        std::cout << "OPPPP\n";
    }
 
    void Swap(Animal& r);
    
};
Производный класс:

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
class Dog:public Animal
{ 
    bool m_bHasMaster; // наличие хозяина
    char* m_pMasterName;     // указатель на строку с именем животного
 
public:
    Dog();
    Dog (int age, bool Master, Sex s, const char* pName, const char* m_pMasterName); // конструктор с параметрами
    Dog(const Dog& ref);
    virtual~Dog();
 
    virtual void Voice()const
    {
        std::cout << "Gav!!!\n";
    }
 
    void Swap(Dog& r);
 
    Dog& operator=(const Dog& r);
    Dog& operator=(Dog&& r);
 
    friend bool operator == (const Dog& f1, const Dog& f2);
    friend std::ostream& operator << (std::ostream& os, const Dog& an);
};

Перегрузил в базовом классе:

C++
1
2
3
4
5
std::ostream& operator<<(std::ostream& os, const Animal& an)
{
    os << "animal: age=" << an.m_age << "sex="<<an.m_sex<<"m_pName="<<an.m_pName;
    return os;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2022, 14:14
Ответы с готовыми решениями:

Вызов оператора= в производном классе
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;numeric&gt; using namespace std; template &lt;class T&gt; class Vector: public...

Перегрузка оператора в классе
Есть такой вопрос из теста(смотри вложение), пробовал все варианты, падает ошибка компиляции. Возможно я неправильно понимаю вопрос, какой...

Перегрузка оператора '=' в классе
#include &lt;iostream&gt; #include &lt;cstring&gt; using std::cout; using std::endl; class CMessage { public: ...

11
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
14.06.2022, 14:16
Лучший ответ Сообщение было отмечено Nik_787 как решение

Решение

Добавить в объявление класса дружественный оператор, только вместо const Animal& использовать const Dog&. Я бы класс Animal сделал абстрактным.
1
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
14.06.2022, 14:27  [ТС]
А, как подключить базовую часть?
0
Заблокирован
14.06.2022, 18:10
Лучший ответ Сообщение было отмечено Nik_787 как решение

Решение

Цитата Сообщение от Nik_787 Посмотреть сообщение
А, как подключить базовую часть?
Куда подключить ?
Если имелось ввиду вызвать перегруженную функцию для базового класса ...
Приведение ссылочных типов такое же как и в указателей. (включая полиморфизм).
Хотя я еще такого не использовал в реальном коде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct A{
    int i = 1;
    friend std::ostream& operator << (std::ostream& os, const A& an);
};
 
struct B: public A{
    int i = 0;
    friend std::ostream& operator << (std::ostream& os, const B& an);
};
 
int main(){
    std::cout<<B();
}
std::ostream& operator << (std::ostream& os, const A& an){
    return os << "Class A(" <<an.i<< ")" << std::endl;
}
std::ostream& operator << (std::ostream& os, const B& an){
    return os << (A&)an << "Class B(" <<an.i<< ")" << std::endl;
}
1
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
14.06.2022, 18:51  [ТС]
Спасибо!!!!
0
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
15.06.2022, 06:14  [ТС]
Вот ещё вариант в новом стиле :

C++
1
2
3
4
5
std::ostream& operator<<(std::ostream& os, const Dog& an)
{
    os<< static_cast<const Animal&>(an) << "m_bHasMaster =" << an.m_bHasMaster << "m_pMasterName =" << an.m_pMasterName;
    return os;
}
0
Заблокирован
15.06.2022, 12:04
Nik_787, в данном случае нужно использовать dynamic_cast<>
0
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
15.06.2022, 12:42  [ТС]
Спасибо!!! Буду знать.))))
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.06.2022, 13:45
Цитата Сообщение от SmallEvil Посмотреть сообщение
в данном случае нужно использовать dynamic_cast<>
Зачем?
0
Заблокирован
15.06.2022, 14:06
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем?
Полиморфизм поддерживать ? Мне так кажется. Я эти нюансы глубоко не знаю.
Но когда изучал полиморфизм, там был пример среза и нарушения полиморфизма без dynamic_cast<> (для указателй) ...
Я думаю что это справедливо и для ссылок.
Если подробнее осветите этот момент, я только за.

Добавлено через 5 минут
Вспомнил, тут нам без разницы.
dynamic_cast это попытка привести типы к другому, если не получился, мы получим ошибку Рантайм, которую в том же рантайм и сможем обработать. Извините. Забылось.
static_cast - приводит типы на этапе компиляции.
Теперь кажись верно.

Добавлено через 1 минуту
Nik_787, можно и статичное приведение типов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.06.2022, 14:37
Цитата Сообщение от Nik_787 Посмотреть сообщение
как перегрузить оператор << в производном классе.
https://rextester.com/ILD56715

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <string>
#include <vector>
 
enum Sex {MALE, FEMALE};
 
class Animal
{
    size_t m_age;
    Sex m_sex;   
    std::string m_name;
public:
    virtual ~Animal(){}
    
    Animal(size_t age, Sex s, std::string name) noexcept
        : m_age(age), m_sex(s), m_name(std::move(name)) 
    {}
 
    virtual std::ostream& out(std::ostream& os) const
    {
        return os << "[animal] " << m_name << ", age: " << m_age << ", sex: "<< m_sex;
    }
 
    virtual void voice() const { std::cout << "[animal] OPPPP\n"; }
    
    const std::string& getName() const noexcept  { return m_name; }
};
 
class Dog: public Animal
{ 
    std::string m_master;
public:
    Dog (size_t age, Sex s, std::string name, std::string master) noexcept 
      : Animal(age, s, std::move(name))
      , m_master(std::move(master))
    {}
    
    virtual ~Dog(){}
 
    virtual void voice() const override { std::cout << "[dog] Gav!!!\n"; }
    
    virtual std::ostream& out(std::ostream& os) const override
    {
        if(m_master.empty())
            return os << "[dog] " << getName();
        return os << "[dog] " << getName() << ", master: " << m_master;
    }
};
 
std::ostream& operator << (std::ostream& os, const Animal& an)
    { return an.out(os); }
 
 
int main()
{
    const std::vector<const Animal*> animals  
    {
        new Animal(2, MALE, "ololo"), 
        new Dog(3, MALE, "trololo", "Nik_787")
    };
    
    for(const auto* p: animals)
        std::cout << *p << '\n',
        p->voice();        
    
    for(const auto* p: animals)
        delete p;
}
output:
Code
1
2
3
4
[animal] ololo, age: 2, sex: 0
[animal] OPPPP
[dog] trololo, master: Nik_787
[dog] Gav!!!
Добавлено через 31 секунду
Цитата Сообщение от SmallEvil Посмотреть сообщение
в данном случае нужно использовать dynamic_cast<>
не нужно.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.06.2022, 16:21
Цитата Сообщение от SmallEvil Посмотреть сообщение
Вспомнил, тут нам без разницы.
dynamic_cast тут скорее избыточен, т.к. мы заранее знаем наш базовый класс.
Но вообще я всегда радуюсь, когда наводяще вопросы достигают цели. Не так ценно что-то объяснить, как то, что человек сам додумался, сподвигся посмотреть документацию и т.д. Если человек сделал это сам, то есть шанс, что он действительно что-то понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2022, 16:21
Помогаю со студенческими работами здесь

Перегрузка оператора [] в классе
У меня есть класс Array(одномерный массив), и стоит задача перегрузка оператора. Реализовать для объектов данного класса перегрузку...

Перегрузка оператора ==, в классе Матрица
#ifndef MATRIX_H #define MATRIX_H template &lt;class T&gt; class Matrix { public: Matrix(int Rows, int Cols); ~Matrix(); ...

Перегрузка оператора в шаблонном классе
Здравствуйте! Есть шаблонный класс Array, описывающий массив. Такая проблема: нужно перегрузить оператор &quot;&lt;&quot;, который...

Перегрузка оператора присваивания в классе
Напишите пожалуйста простой пример перегрузки оператора присваивания в классе и пояснение зачем это надо

Перегрузка оператора + в классе матрица
Есть перегрузка оператора = Matrix&amp; operator = (const Matrix &amp;object) { if (array != nullptr) { for (int i = 0; i &lt;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru