Der ISO C ++ - Standard legt fest, dass alle virtuellen Methoden einer Klasse definiert werden müssen, die nicht rein virtuell sind.
Einfach ausgedrückt lautet die Regel:
Wenn Ihre abgeleitete Klasse die virtuelle Methode der Basisklasse überschreibt, sollte sie auch eine Definition bereitstellen. Wenn nicht, sollte die Basisklasse die Definition dieser Methode bereitstellen.
Benötigt gemäß der obigen Regel in Ihrem Codebeispiel virtual void bar();
eine Definition in der Basisklasse.
Referenz:
C ++ 03 Standard: 10.3 Virtuelle Funktionen [class.virtual]
Eine in einer Klasse deklarierte virtuelle Funktion muss in dieser Klasse definiert oder als rein (10.4) deklariert werden, oder beides. Es ist jedoch keine Diagnose erforderlich (3.2).
Entweder sollten Sie die Funktion rein virtuell machen oder eine Definition dafür bereitstellen.
Die gcc- FAQ dokumentiert dies ebenfalls:
Der ISO C ++ - Standard legt fest, dass alle virtuellen Methoden einer Klasse, die nicht rein virtuell sind, definiert werden müssen, erfordert jedoch keine Diagnose für Verstöße gegen diese Regel [class.virtual]/8
. Basierend auf dieser Annahme gibt GCC nur die implizit definierten Konstruktoren, den Zuweisungsoperator, den Destruktor und die virtuelle Tabelle einer Klasse in der Übersetzungseinheit aus, die ihre erste solche Nicht-Inline-Methode definiert.
Wenn Sie diese bestimmte Methode nicht definieren, kann sich der Linker daher über das Fehlen von Definitionen für scheinbar nicht verwandte Symbole beschweren. Um diese Fehlermeldung zu verbessern, muss möglicherweise der Linker geändert werden. Dies ist jedoch nicht immer möglich.
Die Lösung besteht darin, sicherzustellen, dass alle virtuellen Methoden definiert sind, die nicht rein sind. Beachten Sie, dass ein Destruktor definiert werden muss, auch wenn er als rein virtuell deklariert ist [class.dtor]/7
.