Video: Programmieren in C Tutorial #09 - Funktionen und Rückgabewert 2024
In C ++, nur weil Sie denken, dass ein bestimmter Funktionsaufruf zu spät gebunden ist, bedeutet das nicht, dass es ist. Wenn sie nicht mit den gleichen Argumenten in den Unterklassen deklariert werden, werden die Elementfunktionen nicht polymorph außer Kraft gesetzt, unabhängig davon, ob sie als virtuell deklariert sind oder nicht.
Eine Ausnahme von der identischen Deklarationsregel besteht darin, dass eine überschriebene Memberfunktion in einer Unterklasse einen Zeiger oder eine Referenz auf ein Objekt der Unterklasse zurückgeben kann, wenn die Memberfunktion in der Basisklasse einen Zeiger oder eine Referenz auf ein Basisklassenobjekt zurückgibt… Mit anderen Worten, die Funktion makeACopy () ist polymorph, obwohl sich der Rückgabetyp der beiden Funktionen unterscheidet:
Klasse Base {public: // gibt eine Kopie des aktuellen Objekts zurück base * makeACopy ();}; class SubClass: public Basis {public: // gibt eine Kopie des aktuellen Objekts zurück SubClass * makeACopy ();}; void fn (Basis & bc) {Basis * pCopy = bc. eine Kopie machen(); // weiter mit …}
In der Praxis ist das ganz natürlich. Eine makeACopy () -Funktion sollte ein Objekt vom Typ SubClass , zurückgeben, auch wenn es BaseClass:: makeACopy () überschreiben könnte.
Dieses Geschäft, bei dem stillschweigend entschieden wird, wann eine Funktion überschrieben wird und wann nicht, ist eine Fehlerquelle in C ++; so sehr, dass der 2011-Standard den Deskriptor override eingeführt hat, den der Programmierer verwenden kann, um seine Absicht anzugeben, eine Basisklassenfunktion zu überschreiben.
C ++ generiert einen Compiler-Fehler, wenn eine Funktion außer Kraft gesetzt wird, aber nicht aus irgendeinem Grund (wie einem nicht übereinstimmenden Argument) eine Basisklassenfunktion außer Kraft setzt, wie im folgenden Beispiel: >
Dieses Snippet generiert einen Fehler bei der Kompilierung, weil die Methode GradStudent:: addCourseGrade (float) für override deklariert wurde, aber nicht die Basisklassenfunktion Student:: addCourseGrade (double) außer Kraft setzt, weil die Argumenttypen don ' t passen.
final als nicht überschreibbar deklarieren, selbst wenn diese Funktion selbst eine frühere Basisklassenfunktion überschreibt, wie im folgenden zusätzlichen > PostDoc Klasse: Klasse GradStudent: public Student {public: virtuell void addCourseGrade (double grade) final;}; Klasse PostDoc: public GradStudent {public: virtuell void addCourseGrade (doppelte Note);}; Seit Student:: addCourseGrade () ist markiert
,
Die Deklaration von PostDoc:: addCourseGrade () erzeugt einen Fehler, weil sie versucht, die Student -Methode zu überschreiben.
Klasse GradStudent final: public Student Dies betrifft mehr als nur die virtuellen Methoden der Klasse. Eine
endgültige
-Klasse kann überhaupt nicht vererbt werden.