Dies mag wie eine einfache Frage erscheinen, aber ich kann die Antwort nirgendwo anders finden.
Angenommen, ich habe Folgendes:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
Ist es in Ordnung, dass die Klasse Derived die Funktion bar () nicht implementiert? Was ist, wenn nicht ALLE meiner abgeleiteten Klassen die Funktion bar () benötigen, einige jedoch? Müssen alle virtuellen Funktionen einer abstrakten Basisklasse in den abgeleiteten Klassen implementiert werden oder nur diejenigen, die rein virtuell sind? Vielen Dank
quelle
Derived::bar
hat ein Funktionskörper, der vonAbstract::bar
. Es scheint also, dass die Übersetzungseinheit, in der dies definiert ist (ist sie überhaupt irgendwo definiert?), Nicht mit der Übersetzungseinheit verknüpft ist, in der sie aufgerufen wird.They only need to implement the pure ones.
Es ist irreführend. Die abgeleiteten Klassen nicht unbedingt brauchen zu implementieren reinen entweder virtuellen Funktionen.Nur die rein virtuellen Methoden müssen in abgeleiteten Klassen implementiert werden, Sie benötigen jedoch noch eine Definition (und nicht nur eine Deklaration) der anderen virtuellen Methoden. Wenn Sie keinen angeben, kann sich der Linker sehr gut beschweren.
Wenn Sie also nur
{}
nach Ihrer optionalen virtuellen Methode setzen, erhalten Sie eine leere Standardimplementierung:Eine komplexere Standardimplementierung würde jedoch in eine separate Quelldatei verschoben.
quelle
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]
Entweder sollten Sie die Funktion rein virtuell machen oder eine Definition dafür bereitstellen.
Die gcc- FAQ dokumentiert dies ebenfalls:
quelle
Ja, das ist in Ordnung ... Sie müssen nur reine virtuelle Funktionen implementieren, um eine Klasse zu instanziieren, die von einer abstrakten Basisklasse abgeleitet ist.
quelle
Ja, es ist richtig, dass eine abgeleitete Klasse die Funktion überschreiben muss, die in der übergeordneten Klasse Pure Virtual ist. Die übergeordnete Klasse mit einer reinen virtuellen Funktion wird nur als abstrakte Klasse bezeichnet, da die untergeordnete Klasse einen eigenen Körper der reinen virtuellen Funktion angeben muss.
Für die normalen virtuellen Funktionen: - Es ist nicht erforderlich, sie weiter zu überschreiben, da einige untergeordnete Klassen diese Funktion haben können, andere möglicherweise nicht.
Der Hauptzweck des Mechanismus der virtuellen Funktion ist der Laufzeitpolymorphismus, unabhängig davon, ob der Hauptzweck der reinen virtuellen Funktion (abstrakte Klasse) darin besteht, die gleichnamige Funktion mit dem eigenen Körper obligatorisch zu machen.
quelle