La norme ISO C ++ spécifie que toutes les méthodes virtuelles d'une classe qui ne sont pas purement virtuelles doivent être définies.
En termes simples, la règle est la suivante:
si votre classe dérivée remplace la méthode virtuelle de la classe de base, elle doit également fournir une définition.Sinon, la classe de base doit fournir la définition de cette méthode.
Conformément à la règle ci-dessus dans votre exemple de code, virtual void bar();
nécessite une définition dans la classe de base.
Référence:
C ++ 03 Standard: 10.3 Fonctions virtuelles [class.virtual]
Une fonction virtuelle déclarée dans une classe doit être définie ou déclarée pure (10.4) dans cette classe, ou les deux; mais aucun diagnostic n'est requis (3.2).
Vous devez donc soit rendre la fonction purement virtuelle, soit lui fournir une définition.
La faq gcc le révèle également:
La norme ISO C ++ spécifie que toutes les méthodes virtuelles d'une classe qui ne sont pas purement virtuelles doivent être définies, mais ne nécessite aucun diagnostic pour les violations de cette règle [class.virtual]/8
. Sur la base de cette hypothèse, GCC n'émettra que les constructeurs définis implicitement, l'opérateur d'affectation, le destructeur et la table virtuelle d'une classe dans l'unité de traduction qui définit sa première méthode non en ligne.
Par conséquent, si vous ne parvenez pas à définir cette méthode particulière, l'éditeur de liens peut se plaindre du manque de définitions pour des symboles apparemment sans rapport. Malheureusement, pour améliorer ce message d'erreur, il peut être nécessaire de modifier l'éditeur de liens, ce qui ne peut pas toujours être fait.
La solution est de s'assurer que toutes les méthodes virtuelles qui ne sont pas pures sont définies. Notez qu'un destructeur doit être défini même s'il est déclaré pur-virtuel [class.dtor]/7
.