C ++ Programmierung: Wann ist eine virtuelle Funktion nicht?

In C ++, nur weil Sie denken, dass eine bestimmte Funktion Anruf spät bedeutet das nicht gebunden ist, dass es ist. Wenn nicht mit den gleichen Argumenten in den Subklassen deklariert, werden die Mitgliedsfunktionen polymorph nicht außer Kraft gesetzt, ob sie virtuell deklariert werden.

Eine Ausnahme von der gleichen Erklärung Regel ist, dass, wenn der Member-Funktion in der Basisklasse einen Zeiger oder eine Referenz auf eine Basisklasse Objekt zurückgibt, eine überschriebene Member-Funktion in einer Unterklasse zu einem Objekt der Unterklasse einen Zeiger oder eine Referenz zurückgeben kann. Mit anderen Worten, die Funktion eine Kopie machen() polymorph ist, auch wenn der Rückgabetyp der beiden Funktionen unterscheiden:

class Base {public: // Eine Kopie des aktuellen Objectbase * makeACopy () geben -} - Klasse SubClass: public Basis {public: // Eine Kopie des aktuellen objectSubClass * makeACopy zurückkehren () -} - Leere fn (Basis bc) {Basis * PCOPY = bc.makeACopy () - // gehen auf ...}

In der Praxis ist dies ganz natürlich. EIN eine Kopie machen() Funktion sollte ein Objekt vom Typ zurückgeben Unterklasse, obwohl es möglicherweise außer Kraft setzen Baseclass :: makeACopy ().

Dieses Geschäft von leise zu entscheiden, wann eine Funktion außer Kraft gesetzt wird, und wenn nicht, ist eine Fehlerquelle in C ++ - so sehr, dass die 2011-Standard den Deskriptor eingeführt Überschreibung dass der Programmierer ihre Absicht angeben können, außer Kraft zu setzen eine Funktion der Basisklasse verwenden.

C ++ erzeugt einen Compiler-Fehler, wenn eine Funktion überschreiben deklariert, aber nicht in der Tat, außer Kraft setzen, eine Funktion der Basisklasse aus irgendeinem Grund (wie ein nicht übereinstimmen Argument), wie im folgenden Beispiel:

Klasse Schüler {public: virtual void addCourseGrade (Doppel grade) -} - Klasse GradStudent: public Studenten {public: virtual void addCourseGrade (float grade) Aufschalten -} -

Dieser Code-Schnipsel erzeugt einen Fehler bei der Kompilierung, da die Methode GradStudent :: addCourseGrade (float) erklärt wurde Überschreibung aber es funktioniert nicht, in der Tat, überschreiben Sie die Funktion der Basisklasse Student :: addCourseGrade (double) weil die Argumenttypen nicht übereinstimmen.

Der Programmierer kann auch eine Funktion deklarieren als nicht überschreibbar die Verwendung von Finale Schlüsselwort, auch wenn diese Funktion selbst überschreibt einige frühere Funktion der Basisklasse, wie im folgenden zusätzlichen demonstriert PostDoc Klasse:

Klasse GradStudent: public Studenten {public: virtual void addCourseGrade (Doppel grade) final -} - Klasse PostDoc: public GradStudent {public: virtual void addCourseGrade (Doppel grade) -} -

Schon seit Student :: addCourseGrade () ist markiert Finale, die Erklärung von PostDoc :: addCourseGrade () einen Fehler erzeugt, weil es außer Kraft zu setzen versucht der Schüler Verfahren.

Darüber hinaus kann eine ganze Klasse deklariert werden Finale:

Klasse GradStudent Finale: Public Schüler

Dies betrifft nicht nur die virtuellen Methoden der Klasse. EIN Finale Klasse kann nicht von überhaupt vererbt werden.

Menü