![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gamedeveloper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 8.7.2007 Репутация: нет Всего: нет |
Можно ли на С++ перегрузить виртуальную функцию в классе наследнике?
Код не рабочий, но думаю идея ясна.
|
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
ну в общем случае можно, только спрашивается для чего?
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
никак нет, абсолютно не ясна ![]() вот это
уже не виртуальная фунция, к тому-же SuperClass о ней ничего не знает, так что я затрудняюсь ответить как это может быть использовано... |
|||
|
||||
gamedeveloper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 8.7.2007 Репутация: нет Всего: нет |
Если идея не ясна, тогда так:
Есть базовый клас SuperClass. В нём есть виртуальная функция memfunc с входным параметром типа char*. Есть наследник базового класса SubClass. В нём есть унаследованная виртуальная функция memfunc, НО уже с входным параметром double. Такое может быть на Си++? То есть можно ли перегрузить при наследовании виртуальную функцию? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
нельзя. и не нужно:
у тебя явно какая-то задача, имеющая другое (возможно, очень простое) решение Это сообщение отредактировал(а) baldina - 2.6.2008, 23:08 |
|||
|
||||
gamedeveloper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 8.7.2007 Репутация: нет Всего: нет |
Задачи как таковой нет. Просто с другом о языках спорим. Вот он и завёл тему про перегрузку виртуальных функций в иерархии. Я пробовал сделать, но компилятор и линкер по очереди ругались, то нельзя создать экземпляр абстрактного класса, то в SuperClass нет void memfunc(double).
Вот и решил у более обознаных людей спросить. Я пока тему не снимаю, может у кого то ещё есть мнение... Это сообщение отредактировал(а) gamedeveloper - 2.6.2008, 23:24 |
|||
|
||||
opjox |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 17.1.2008 Репутация: 1 Всего: 14 |
Можно перегрузить. Однако, чтобы создать экземпляр SubClass надо в нем все таки определить memfunc(char *str). Также в предложенном коде есть неточность – функция memfunc(double d) не будет виртуальной, это можно наглядно понять из этого кода (этот код аналогичен первичному, за исключением необходимо определенной memfunc(char *str) ):
Предполагаю, что в итоге хотелось увидеть примерно это (вариант перегрузки виртуальной функции в классе-наследнике):
|
||||
|
|||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
gamedeveloper, нужно различать статическое и динамическое связывание. Когда виртуальная функция переопределяется, то при её вызове происходит поиск конкретной реализации в зависимости от вызывающего класса (во время выполнения). А когда виртуальная функция перегружается то поиск производится по типу аргументов (во время компиляции) и смысл виртуальности пропадает.
|
|||
|
||||
opjox |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 17.1.2008 Репутация: 1 Всего: 14 |
georain, или я вас не до конца понял, или же вы немного неправы. Довольно абстрактно говоря, перегрузку виртуальной функции можно назвать созданием еще одной ветви в виртуальной иерархии.
Прибегая к перегрузке виртуальных функций, мы столкнемся как с динамическим, так и статическим связыванием: во время компиляции будет определена ветвь исходя из типа, а во время исполнения будет выбрана конкретная реализация функции из той ветви, которая была определена на момент компиляции. При этом не теряется смысл виртуальности. P.S. или мне опять нужно больше спать? ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
georain и opjox правы оба, только говорят чуть о разном. Тут и то и другое - во время компиляции выбирается сигнатура функции, во время выполнения (если данная сигнатура определила виртуальную функцию) происходит поиск функии по таблице.
Все может иметь место одновременно. Можно представить это таким образом: виртуальная функция определяет набор поведений объектов различных типов в одной иерархии (скажем, функция draw() в иерархии графических примитивов), а перегруженная - набор однотипных операций по различным входным данным (например, функции MessageBox (UINT RscId) и MessageBox (const char* message)) gamedeveloper, возможности языка не возникают на пустом месте. Есть конкретные задачи, для них - конкретные решения в языке. Есть вещи, напрямую языком не поддерживаемые. Например, мультиметоды не поддерживаются С++ - они как раз близки к обсуждаемой теме. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
|
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Согласен opjox более правильно изложил
![]() |
|||
|
||||
gamedeveloper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 8.7.2007 Репутация: нет Всего: нет |
Всем спасибо.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |