| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Вызов виртуального метода потомка из базового |
| Автор: andrew_121 25.1.2010, 08:38 | ||||||
есть такой класс:
из него выведен такой:
при запуске вот что выводит:
из этого понятно что программа рушится обрабатывая конструктор базового класса. где ступил? linux, g++ |
| Автор: mes 25.1.2010, 09:48 |
нельзя в конструкторе прямо или косвенно вызывать чисто-виртуальные методы.. для (всех) виртуальных функций действует правило - вызывается тело виртуальной функции базового класса, так как наследник еще не сформирован.. |
| Автор: andrew_121 25.1.2010, 10:17 |
| mes, так "thread_func()" это статический метод. т.е. в потомке он будет(должен) вызывать переопределенный метод потомка. или не так? в общем, как исправить? |
| Автор: Леопольд 25.1.2010, 10:29 | ||
Обязательно через void* передавать? Так всё работает. Значит проблема в использовании.
|
| Автор: Alca 25.1.2010, 10:30 | ||
а если так?
|
| Автор: Lazin 25.1.2010, 10:30 |
| andrew_121, у тебя run вызывается в конструкторе |
| Автор: Alca 25.1.2010, 10:34 | ||
где именно? |
| Автор: mes 25.1.2010, 10:37 |
так в этой статической вызывается виртуальная можно применить "статическую виртуализацию" (CRTP Patern) если полиморфизм не нужен либо стартер-враппер или принимать функциональный объект. в любом случае перепроектировка класса. |
| Автор: andrew_121 25.1.2010, 10:46 |
да. pthread_create() требует указатель на функцию типа void* (*)(void*) точно! потомок же еще не создан. сейчас проверю. |
| Автор: Леопольд 25.1.2010, 10:53 | ||||||
В конструкторе thread_base передаётся this в pthread_create. Тут потенциальная ошибка. Сначала создаются базовые классы, потом наследники. В конструкторе thread_base можно считать созданной только базовую часть объекта а значит в vtbl нет указателей на переопределённые функции потомка. Поэтому, прямо или косвенно, никак нельзя вызвать то чего ещё нет. По всей видимости именно такая попытка и делается. Но ничего не мешает вызвать pthread_create из конструктора последнего потомка. Не стоит расценивать как предложение реализовать таким образом. Сам я бы так не сделал
|
| Автор: mes 25.1.2010, 11:16 | ||
внешним объектом/функцией который вначале создаст а потом запустит. |
| Автор: andrew_121 25.1.2010, 11:23 |
понятно. всем спасибо! вопрос закрыт. |