| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Перегрузка инкремента? |
| Автор: IvanoffAndrey 16.9.2007, 16:54 | ||
| Здравствуйте. Данная тема уже поднималась на этом форуме. http://forum.vingrad.ru/topic-17379.html Но толи там ошибка в формулировки проблемы то ли в чем непонятно. Короче, у меня ситуация полность противоположенная. Непроходит вот этот код
Решение этой проблемы я уже прочитал в топике ранее. Однако не понятно: почему не компилируется данный код? Ошибка: Error 1 error C2555: 'Ss<T>::operator ++': overriding virtual function return type differs and is not covariant from 'Fs<T>::operator ++' |
| Автор: archimed7592 16.9.2007, 17:16 |
| Тип возвращаемого значения виртуальной ф-ции если и можно менять(не помню), то в очень ограниченных рамках. Добавлено через 14 секунд Сделай опретор не виртуальным и всё будет гут. |
| Автор: Daevaorn 16.9.2007, 17:20 |
Потомо что идет перекрытие унаследованного оператора, но при этом у наследника возвращаемый тип другой. |
| Автор: Skladnoy 16.9.2007, 17:27 |
| Ну во первых, работа телепата в наше время оплачивается отчаянно хорошо, и все телепаты телепортировались кто на Багамы, кто куда. Поэтому было бы неплохо написать на что именно ругается компилятор. Проблем в коде две: 1. Приватные конструкторы класса Ss (название вполне бессмысленное) 2. Операторы имеют разный тип возвращаемого значения и не могут быть перегружены. Делать их виртуальными потому бессмысленно. Можно применить маленькую хитрость описанную в "уже поднятой теме" |
| Автор: IvanoffAndrey 16.9.2007, 17:34 | ||||
Т.е. Тип возвращаемого значения вирутальной функции можно сменить с Fs<T> & на Ss<T> & (при виртуальности префиксного оператора), а вот с Fs<T> const на Ss<T> const нельзя? Ну это вооще же неочевидно. А Где можно посмотреть про то в каких пределах можно менять тип возвращаемого значения виртуальной функции?
Исправился. Я честно говоря впервые столкнулся с этим вопросом. |
| Автор: IvanoffAndrey 16.9.2007, 17:48 | ||
Плиз переведите в кратце о чем говорится. А то я что то пасую перед этим текстом. Знаний англицкого не хватает. |
| Автор: archimed7592 16.9.2007, 17:56 |
| Это должна быть ссылка на класс или указатель на класс. Класс на который ссылаемся/указываем должен быть таким же или в Ss-версии должен быть класс прямо или косваенно унаследованный от класса из Fs-версии. cv-квалификация указателя должна быть такой же. cv-квалификация класса на который указываем/ссылаемся в Ss-версии должна быть такой же, как и в Fs-версии или более слабой. cv-квалификация - это const volatile квалификация. |
| Автор: IvanoffAndrey 16.9.2007, 17:59 |
| Мда, неожиданно. archimed7592 - держи плюс. Добавлено @ 18:03 Ну почему стандарт на русский не переведут???? Или хотя бы оглавление стандарта. Книжки всякие дебильные переводят, а стандарт нет. Что им трудно в виде книги выпустить или хелпа? Все спасибо вопрос закрыт. |
| Автор: archimed7592 16.9.2007, 19:43 | ||
А смысл? Если ты не знаешь английский - стандарт не для тебя. В программировании без английского никуда. Тем более, что и так немаленький стандарт в русском переводе получиться ещё больше(на русском невозможно так точно и лаконично формулировать утверждения). К слову, английский люблю больше чем С++ |
| Автор: Daevaorn 16.9.2007, 19:51 | ||
А главное доберет ещё неточностей, которых и так там хватает. |
| Автор: IvanoffAndrey 16.9.2007, 20:55 |
| Тем не менее, я думаю что всетаки не помешало бы. |
| Автор: archimed7592 17.9.2007, 09:16 |
Не ты один так думаешь Он кстати ответ на мой давнишний комментарий о бессмыслености перевода зачем-то оформил как отдельный пост, который сейчас на главной странице... Только сейчас набрёл |
| Автор: Earnest 17.9.2007, 18:42 | ||
Это как раз вполне очевидно: полиморфизм поддерживают ссылки и указатели, а не сами объекты... Если ты (в своем варианте) вызовешь через указатель на базовый класс функцию для объекта производного, а потом присвоишь возвращаемое значение базовому объекту (а иначе не получится) - произойдет срезка, со всеми вытекающими последствиями. А если не вызывать полиморфно, но зачем виртуальные функции. |