Стандарт 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
.