Стандарт ISO C ++ указывает, что должны быть определены все виртуальные методы класса, которые не являются чисто виртуальными.
Проще говоря, правило таково:
если ваш производный класс переопределяет виртуальный метод базового класса, он также должен предоставлять определение. Если нет, то базовый класс должен предоставлять определение этого метода.
В соответствии с приведенным выше правилом в вашем примере кода virtual void bar();
требуется определение в базовом классе.
Справка:
C ++ 03 Стандарт: 10.3 Виртуальные функции [class.virtual]
Виртуальная функция, объявленная в классе, должна быть определена или объявлена чистой (10.4) в этом классе, либо в обоих случаях; но диагностика не требуется (3.2).
Так что либо вам следует сделать функцию чисто виртуальной, либо дать ей определение.
В НКУ чаво doccuments это так:
Стандарт ISO C ++ указывает, что все виртуальные методы класса, которые не являются чисто виртуальными, должны быть определены, но не требует какой-либо диагностики нарушений этого правила [class.virtual]/8
. Основываясь на этом предположении, GCC будет генерировать только неявно определенные конструкторы, оператор присваивания, деструктор и виртуальную таблицу класса в блоке перевода, который определяет его первый такой не встроенный метод.
Поэтому, если вы не можете определить этот конкретный метод, компоновщик может пожаловаться на отсутствие определений для явно несвязанных символов. К сожалению, чтобы улучшить это сообщение об ошибке, может потребоваться изменить компоновщик, а это не всегда можно сделать.
Решение состоит в том, чтобы гарантировать, что все виртуальные методы, которые не являются чистыми, определены. Обратите внимание, что деструктор должен быть определен, даже если он объявлен чисто виртуальным [class.dtor]/7
.