| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Полиморфизм и позднее связывание |
| Автор: Morel 23.8.2004, 09:09 | ||
Понять одну вещь никак не могу.
При раннем связывании все нормально вызывается TranslateMessage() из класса Pshaiba. А вот при позднем из Device. Почему так происходит? |
| Автор: Конструктор 23.8.2004, 09:15 |
| Хм интересно как TranslateMessage вызывается из Device, если она там чисто-виртуальная функция? |
| Автор: Morel 23.8.2004, 09:36 |
| Ну вот так и вызывается: Pure virtual function called Я и спрашиваю почему она оттуда вызывается, а не из Pshaiba. |
| Автор: gray_k 23.8.2004, 09:52 |
| А как ты определил, что вызывается из Device? Она там у тебя объявлена нулевой, а значит реализации иметь не может. Мне кажется ты чего-то путаешь. |
| Автор: Конструктор 23.8.2004, 09:54 | ||
Вот я написал у себя:
У меня оба раза выводится TranslateMessage. (BC 3.1) Попробуй Options->Compiler->C++ Options->C++ Virtual tables->[X] Smart |
| Автор: Vyacheslav 23.8.2004, 10:37 |
| Может она из конструктора вызывается? |
| Автор: 3,14 23.8.2004, 10:52 | ||
Дык код правильно работает
Выведет Translate message |
| Автор: Morel 24.8.2004, 09:15 | ||||
Это я напутал с конструктором Pshaiba. В нем вызывал
Получилось, что вызывались два конструктора Device, по умаолчанию и мой с параметрами. Сделал инициализацию отдельной функцией в Device
Все заработало. Вопрос теперь чисто теоретический. Почему p.TranslateMessage() работал правильно? |
| Автор: 3,14 24.8.2004, 09:59 |
| Он и должен работать правильно, пер-ая p имеет тип Pshaiba и, следовательно, вызывает TranslateMessage описанный в Pshaiba |
| Автор: Vyacheslav 24.8.2004, 12:04 |
| ВСе таки надо поставить точки над i Сообщение Pure virtual function called Можно получить только в одном случае : вызвать виртуальную функцию в теле конструктора производного класса. Это имело место или нет ? |
| Автор: lynx_916 24.8.2004, 22:19 | ||
поправочка, чисто виртуальную, а это большая разницца. |
| Автор: Morel 25.8.2004, 09:17 | ||||
2: 3,14
А p1 другой что ли? Вот как это происходит.
Если в конструкторе Pshaiba вызвать init(), то все нормально. |
| Автор: Borisff2003 25.8.2004, 09:29 | ||
| Сделал твой код он прекрасно делается без всякого init И такой вот делается
|
| Автор: Morel 25.8.2004, 09:45 |
| Странно у меня стабильно вылетает в BC 3.1, именно на строке p1->TranslateMessage();. Твой код понятно что будет работать. Я же говорил, что моя проблемма в конструкторах. |
| Автор: Vyacheslav 25.8.2004, 10:03 | ||
Прваивильно будет так
|
| Автор: Vyacheslav 25.8.2004, 10:23 | ||||||
Я имел в виду следущее
|
| Автор: Конструктор 25.8.2004, 13:07 | ||
ИМХО какой-то изврат, который все же работает как и должен, т.е. пытается вызывать чисто-виртульную ф-цию. |
| Автор: Borisff2003 25.8.2004, 13:13 |
| Morel ВЕСЬ Приведенный тобой код работает в VC6. А кстати, можно ли вызывать виртуальные функции из конструктора? |
| Автор: 3,14 25.8.2004, 14:12 |
| А после компиляции gcc при запуске ошибку кидает |
| Автор: Vyacheslav 25.8.2004, 16:56 |
| Виртуальные функции вызывать из конструктора можно. Только нужно учитывать определенные особенности при вызове. Формально при вызове из конструктора она ведет себя как невиртуальная |
| Автор: Borisff2003 26.8.2004, 05:21 | ||
Что мы и имеем |
| Автор: Vyacheslav 26.8.2004, 09:07 | ||
Кстати на заметку. В С++Builder VCL-ные классы(т.е. те которые являются производными от TObject) ведут себя иначе, нарушая стандарт. При вызове виртуальной функции в конструкторе, она вызывается именно как виртуальная. В результата в принципе возможно переопределять тело базового конструктора
Причем эта особенность имеется толькло у VCL-классов. Для обычных все работает по стандарту |
| Автор: Morel 26.8.2004, 09:15 |
| Всем спасибо вроде разобрался. Отдельное спасибо за Pshaiba::Pshaiba(int i):Device(i). |