| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > реализация виртуального метода в наследнике |
| Автор: boostcoder 19.7.2012, 21:19 | ||||||||
| халоф пиплы! сегодня был озадачен следующим. имеем базовый абстрактный класс описанный в хидере base.hpp:
далее, наследуем его в класс derived, описанный в derived.hpp:
и далее, пытаемся реализовать base::m() в наследнике в его .cpp файле:
то получаю:
я чего-то недопонимаю? или что? спасибо. зы если его реализовать прям внутри декларации derived - то все ок. |
| Автор: Qu1nt 19.7.2012, 21:36 |
| Ты забыл объявить метод m в derived. |
| Автор: boostcoder 19.7.2012, 21:42 |
| Qu1nt, т.е. я должен продублировать декларации методов предка в наследнике? а как же http://en.wikipedia.org/wiki/One_Definition_Rule? |
| Автор: Randajad 19.7.2012, 21:54 |
| А оно к этому случаю относится? О.о |
| Автор: borisbn 19.7.2012, 22:07 | ||
ващето не "должен", а "обязан" |
| Автор: boostcoder 19.7.2012, 22:08 |
| а двойная декларация одного и того же, разве не относится к ODR? oO |
| Автор: mes 19.7.2012, 22:15 |
| boostcoder, может в отпуск пора ? Добавлено через 2 минуты и 2 секунды декларация (обьявление) может быть сколь угодно много раз.. это вот с определениями проблема.. Добавлено через 3 минуты и 36 секунд ODR - one definition rule, not one declaration rule.. |
| Автор: boostcoder 19.7.2012, 22:19 |
| mes, пора. надеюсь со следующей недели выйду. но все равно не понимаю, зачем мне дважды декларировать одни и те же методы допустим, в предке я изменю декларацию метода. так мне что, нужно во всех наследниках проделать то же самое? где логика? |
| Автор: mes 19.7.2012, 22:21 | ||
c++ потому что.. |
| Автор: boostcoder 19.7.2012, 22:21 |
это я-то понимаю. но вод по логике, что-то тут не вяжется... Добавлено через 1 минуту и 8 секунд аааа, ну да. так можно на любой вопрос по С++ ответить =) в общем понял, что так оно и задумывалось. всем спасибо. |
| Автор: mes 19.7.2012, 22:24 |
ага - лишний труд ) Добавлено через 3 минуты и 13 секунд но на этот по другому никак не ответить |
| Автор: boostcoder 19.7.2012, 22:32 |
пора на D переходить. скоро в GCC добавят поддержку. |
| Автор: bsa 19.7.2012, 23:49 |
Угу. Только осталось дождаться библиотек под него... |
| Автор: boostcoder 20.7.2012, 12:27 | ||
он чисто виртуальный. перебить его не получится до тех пор, пока он не реализован. на основании этого, компилятор точно знает что в наследнике происходит не переопределение, а реализация. мне так думается... |
| Автор: xvr 20.7.2012, 16:50 | ||
Компилятор не знает, а происходит ли она вообще (если он не видит описания класса). |
| Автор: boostcoder 20.7.2012, 18:13 |
как это незнает? при компиляции cpp`ишки, компилятор получает декларацию. из нее он все знает. или что? |
| Автор: xvr 20.7.2012, 20:18 | ||||||
Не все он знает ... Вот ваша декларация -
Теперь я в нем делаю
Более того, даже если base::m будет не чисто виртуальной, как компилятор здесь (положим, что он захочет именно здесь это сделать) будет формировать таблицу виртуальных методов для derived? Что он должен положить в vtbl::m ? Откуда он узнает, что вы ее где то описали в другом месте? |
| Автор: boostcoder 21.7.2012, 07:52 |
| xvr, да, Вы правы. |