Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89

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

13.11.2010, 22:21. Показов 2358. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Столкнулся со следующей проблемой:

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
class A {
    int data,info;
    // ..
public:
    friend void operator <<(ostream &a, A *&bb){
        a<<bb->data<<bb->info;
    }
};
 
class B : public A {
    int datainfo;
    //...
public:
    friend void operator <<(ostream &a, B *&gg) {
        a<<gg->data<<gg->datainfo<<gg->info;
    }
};
 
//....
//....
A *p=new B;
//....
cout<<p; // вот здесь вызывается перегрузка << класса А.
         // я понимаю, почему это происходит, но как сделать так,
         // чтобы испольковалась перегрузка << класса В
         // незнаю... Помогите мне, неопытному человеку, пожалуйста.. Т_Т
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2010, 22:21
Ответы с готовыми решениями:

Наследование. Перегрузка операторов
Не понятно, почему компилятор ругается на 49 строку - &quot;отстутствует оператор &quot;++&quot;, соответствующий этим операндам&quot;. В производном...

Наследование и перегрузка операторов.
У меня есть базовый класс class myfloat { protected: int c; int z; void reduce(); public: myfloat(float num=0);

Наследование и перегрузка операторов
Помогите, пожалуйста! Ткните носом в ошибки.. не судите строго - первая прога в С++, как и в объектно-ориент программировании: ...

19
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 22:22
объявить оператор в классе и сделать его виртуальным
0
 Аватар для Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
13.11.2010, 22:26  [ТС]
alex_x_x, уже пробовал..((

error C2804: бинарный "operator <<" имеет слишком много параметров
error C2333: A::operator <<: ошибка в объявлении функции; пропуск основного текста функции

-- это если я убираю friend, и ставлю virtual.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 22:43
чет я надолго впал в ступор, а проблема очевидна, оператор << вы привыкли применять так
(поток) << (чтото)
у нас же
(объект) << (чтото)

C++
1
2
3
4
5
6
7
8
class A {
 int data,info;
 // ..
public:
 virtual ostream& operator<<(A *&bb){
    return cout << bb->data << bb->info ;
 }
};
либо хранить какой-то поток, в которой и будете выводить
1
 Аватар для Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
13.11.2010, 23:05  [ТС]
alex_x_x, а не могли бы Вы продемострировать хранение потока, в который мы будемм вводить?

ps. компилятор на ваш вариант не ругался, да вот только теперь при cout<<p; выполняется стандартная директива..(
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 23:23
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
 int data,info;
 ostream* os;
public:
 A( ostream* _os ) : data(0), info(0), os(_os){}
 virtual ostream& operator<<(const A &bb){
    return( *os << bb.data << bb.info );
 }
};
 
int main(){
  A a(&cout), b(&cout);
  a << b;
}
1
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
13.11.2010, 23:40
Можно вот так:
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
#include <iostream>
 
using namespace std;
 
class A 
{
protected:
    int data, info;
public:
    friend ostream & operator <<(ostream &out, A &bb)
    {
        bb.print(out);
        return out;
    }
 
    virtual void print(ostream &out)
    {
        out << data << ' ' << info;
    }
};
 
class B : public A
{
    int datainfo;
public:
    void print(ostream &out)
    {
        out << data << ' ' << datainfo << ' ' << info;
    }
};
 
int main()
{
    A *p = new B;
    cout << *p;
}
1
Заблокирован
13.11.2010, 23:41
alex_x_x, что это за ...

я бы сделал так

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
class A 
{
protected:
    int data,info;
    
public:
    virtual void print(ostream &s) const
    {
        s << data << ' ' << info;
    }
    ~A(){}
};
 
class B : public A 
{
    int datainfo;
    //...
public:
    virtual void print(ostream &s) const
    {
        s << data << ' ' <<  datainfo << ' ' << info;
    }
};
 
ostream& operator <<(ostream &s, const A& a){
    a.print(s);
    return s;
}
а можно вообще не определять оператор<< и использовать метод A:rint

Добавлено через 47 секунд
Хохол, оказался быстрее)
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 23:42
Цитата Сообщение от tartikov Посмотреть сообщение
alex_x_x, что это за ...
ну тема перегрузка <<, например
а что вам не нравится?
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
13.11.2010, 23:44
Цитата Сообщение от alex_x_x Посмотреть сообщение
а что вам не нравится?
C++
1
A a(&cout), b(&cout);
Как-то это... негибко...
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 23:46
C++
1
2
fstream f( "c:\\123.txt", std::ios_base::out );
A a(&f);
в вашем случае придется менять код класса
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
13.11.2010, 23:47
С чего бы это менять код класса?
f << a;
0
Заблокирован
13.11.2010, 23:49
Цитата Сообщение от alex_x_x Посмотреть сообщение
а что вам не нравится?
покажите как добавить класс B, чтоб можно было по указателю A* b = new B() напечатать его данные
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2010, 23:52
Цитата Сообщение от Хохол Посмотреть сообщение
С чего бы это менять код класса?
f << a;
ну да
Цитата Сообщение от tartikov Посмотреть сообщение
покажите как добавить класс B, чтоб можно было по указателю A* b = new B() напечатать его данные
зачем?
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
13.11.2010, 23:55
Лучше всего делать так:
C++
1
2
3
friend std::ostream & operator << (std::ostream & stream, const A & a){
       return stream << a.data << a.info;
}
0
Заблокирован
13.11.2010, 23:55
Цитата Сообщение от alex_x_x Посмотреть сообщение
зачем?
потому что это то что просил ТС. ))
0
 Аватар для Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
14.11.2010, 00:20  [ТС]
Хохол, у вас отличная идея. Но меня как-то всё же смущает функция print() в том смысле, что там есть printf(). Я стараюсь обходится, в методах классов, без этой функции, кроме перегрузки <<, конечно, но в данной ситуации я ничего не могу придумать, или скорее даже, - предпринять..
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
14.11.2010, 00:37
Цитата Сообщение от Sasuke Посмотреть сообщение
там есть printf()
Галлюцинации?
1
 Аватар для Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
14.11.2010, 00:53  [ТС]
Хохол, извините, грубо ошибся.) xD Я имел ввиду out.))
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
14.11.2010, 01:08
Sasuke, out - это поток. Чем он вас не устраивает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2010, 01:08
Помогаю со студенческими работами здесь

Наследование и перегрузка методов
Здравствуйте. Пытаюсь выполнить упр. 8 из главы 11 книги Р.Лафоре &quot;ООП в С++&quot;, соорудил такое древо классов (картинка в конце поста). Если...

Наследование от ofstream и перегрузка <<
Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на...

Наследование, перегрузка, конструктор
#include &lt;iostream&gt; class animal { public: animal() { } animal(int a) { age = a; } ~animal() { } void set_age(int b) { age...

Перегрузка оператора ввода и наследование
Добрый день! Обращаюсь по такому поводу. Есть одна программа, в которой требуется перегрузить операторы ввода.вывода для одного из...

Ромбовидное наследование и перегрузка виртуальных функций
Дан класс Parent с виртуальным методом method. У него есть два потомка FirstChild и SecondChild. От этих двух потомков образуется класс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru