![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Jcs |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Есть базовый класс, в котором определены всякие операторы инкремента и декркмента (виртуально). Если бы его наследуем, то в дочернем классе у оных меняются типы (для постинкремета и декремента - возращается экземпляр дочернего класса, для преинкременета и декрамента - ссылка на дочерний класс).
Компилятор для первых двух говорит, что типы виртуальных функций должны совпадать, для вторых - все нормально. Неужели единственный выход - отказ от виртуальности? Заранее спасибо. |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
похоже, единственный, я другого не вижу, да и в STL они не виртуальные (файлик iterator без .h, если я все правильно понял).
|
|||
|
||||
RAN |
|
||||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Нет смысла делать operator'ы виртуальными. Их всё равно придётся перегружать для каждого конкретного типа и будет выбираться тот оператор, который подходит под тип опреранда.
Например, класс B наследуется от A. В классе A есть вирутальный оператор ++. Теперь если вызвать эту операцию для объекта B, то будет использоваться функция для типа B, а у нас определена только для A.
Теперь по поводу ошибок. Я так понял, под отказом от виртуальности ты понимаешь переписывание этих операторов для каждого класса. Это не правильный подход. Использовать функции из первого класса всё-таки можно и нужно. Тут дело в том, что нельзя вернуть объект одного класса, как объект совсем другого класса, унаследованого от первого. Тут не проходят простые приведения типов. Класс B должен иметь конструктор от класса A для того, чтобы создать новый объект и вернуть его. Так что добавь
и всё заработает. |
||||
|
|||||
Jcs |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Конструктор преобразования у меня есть.. А виртуальность я хотел использовать для того, чтобы в случае
вызывались нужные операторы, каждый для своего класса. Если операторы будут невиртуальными, то придется городить преобразование типа, к тому же не во всех случаях оно будет безопасным. |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Это решается по другому. Тебе надо ввести вирутальную функция для инкремента и перегрузить operator++, который будет вызывать эту функцию.
И насчёт конструтора. Очень странно, что возникала ошибка. Этого не может быть. Но при подходе, описанном чуть выше, это уже не важно. |
|||
|
||||
Jcs |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Спасибо за ответ. Я операторы префиксного типа сделал виртуальными, т.к. они возвращают ссыклку и компилятор не ругается, а постфиксная форма легко реализуется через префиксную.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |