Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > почему у виртуальной ф-ии должно быть пустое тело? |
Автор: mrgloom 8.5.2014, 14:20 | ||||||||||||
ожидание
получаю ошибку prog.cpp:(.text.startup+0x14): undefined reference to `vtable for A' prog.cpp:(.text.startup+0x2d): undefined reference to `A::vf()' https://ideone.com/MFvAdP так работает
https://ideone.com/NXV8tl по почему по логике виртуальная ф-ия должна быть определена в базовом классе? по идее если не определена, то это рушить программу
это ок
причем без вызова ф-ии компилируется
https://ideone.com/dogCao понятно что можно было бы написать
и это бы еще запретило создавать экземпляр класса А чтобы не вызвать ф-ию A.vf() которой нет. https://ideone.com/aXSHAD |
Автор: vinter 8.5.2014, 17:15 |
mrgloom, моя твоя не понимать. Ты что хотел, то? Взял, написал объявление функции, без определения, и чего-то ждёшь? Конечно оно не будет работать. vtable для A не может быть создана, т.к. в vtable помещается указатель на реализацию каждой virtual функции. А ты функцию не реализовал! |
Автор: bsa 8.5.2014, 20:22 | ||
mrgloom, у тебя есть гарантия, что ты можешь вызвать любую виртуальную функцию любого объект класса, их имеющего. Чтобы это выполнялось есть три пути: 1. не дать тебе создать объект класса, у которого тело виртуальной функции не определено 2. не дать тебе скомпилировать код, в котором есть объявленные, но не реализованные виртуальные методы. 3. прерывать работу программы, которая пытается вызвать нереализованные виртуальные методы Все эти варианты поддерживаются языком С++. Для первого варианта используются чисто виртуальные (абстрактные) методы. Со вторым вариантом ты уже столкнулся. Третий вариант может быть реализован как "последний рубеж защиты", если два предыдущих не отработали или сбой в программе. Думаю, тебя интересует первый вариант. Это делается так:
|
Автор: mrgloom 12.5.2014, 15:24 |
bsa вся написал правильно и логично. лучше всего в этом случае использовать pure virtual function но смущает только 3 вариант когда класс объявлен с ошибкой и экземпляр его можно даже объявить и это не приводит к ошибке компиляции. https://ideone.com/qCyWat хотя это от компилятора наверно зависит. т.к. тут не компилируется http://www.compileonline.com/compile_cpp11_online.php |