4 Stimmen

Fehlender "virtueller" Qualifizierer in Funktionsdeklarationen

Beim Durchstöbern von altem Code bin ich auf etwas gestoßen, das dem folgenden ähnelt:

class Base
{
public:
    virtual int Func();
    ...
};

class Derived : public Base
{
public:
    int Func(); // Missing 'virtual' qualifier
    ...
};

Der Code lässt sich gut kompilieren (MS VS2008), es gibt keine Warnungen (Stufe 4) und er funktioniert wie erwartet. Func virtuell ist, obwohl der virtuelle Qualifizierer in der abgeleiteten Klasse fehlt. Abgesehen davon, dass er Verwirrung stiftet, birgt dieser Code irgendwelche Gefahren, oder sollte ich alles ändern, indem ich die virtual Qualifier?

10voto

Blair Conrad Punkte 217777

Le site virtual wird auf alle überschreibenden Funktionen in abgeleiteten Klassen übertragen. Der einzige wirkliche Vorteil des Hinzufügens des Schlüsselworts besteht darin, dass ein zufälliger Beobachter der Definition einer abgeleiteten Klasse sofort erkennt, dass Func ist virtuell.

Auch Klassen, die Derived erweitern, haben virtuelle Func-Methoden.

Referenz: Virtuelle Funktionen auf MSDN. Scrollen Sie auf der Seite nach unten, um Folgendes zu sehen

Le site virtuell Schlüsselwort kann verwendet werden, wenn Deklaration von überschreibenden Funktionen in einer abgeleiteten Klasse deklariert werden, aber es ist nicht notwendig; Überschreibungen von virtuellen Funktionen sind immer virtuell.

0 Stimmen

Ausgezeichnet. Aber das Hinzufügen schadet nicht, und für jemanden, der sich den Code zum ersten Mal ansieht, könnte es von Vorteil sein?

0 Stimmen

Der einzige Schaden, den das Hinzufügen von virtual anrichten kann, ist, dass wenn virtual jemals aus der Basisklasse entfernt wird, sollte es vermutlich auch aus allen abgeleiteten Klassen entfernt werden. Aber jemand, der diesen Refactor durchführt, muss sich der Auswirkungen auf abgeleitete Klassen ohnehin bewusst sein, daher würde ich das nicht als Problem betrachten.

2voto

James Hopkin Punkte 13389

Hier ist eine interessante Folge davon, dass man überschreibende Funktionen nicht als virtuell deklarieren muss:

template <typename Base>
struct Derived : Base
{
    void f();
};

Ob die Funktion f von Derived virtuell ist, hängt davon ab, ob Derived mit einer Base instanziiert wird, die eine virtuelle Funktion f mit der richtigen Signatur hat.

0voto

Emmanuel Caradec Punkte 2272

Jemand hat mir einmal erzählt, dass sehr alte C++-Compiler, die nicht mit der Spezifikation übereinstimmen, verlangen, dass für alle Unterklassen virtuell festgelegt wird. Das ist heute kein Problem mehr.

0voto

Andy Dent Punkte 16955

Eine Gefahr, die sich aus dieser Praxis ergibt, besteht darin, dass die Benutzer nicht erkennen, dass sie das virtuelle Schlüsselwort für Funktionen benötigen, die eigentlich virtuell sein sollen. Dies gilt vor allem für Personen, die aus Sprachen kommen, in denen es kein Konzept für nicht-virtuelle Funktionen gibt (z. B. Java, REALbasic). Infolgedessen kann man nicht erkennen, wenn virtual absichtlich weggelassen wurde, weil eine Funktion nicht-virtuell sein soll.

Ich vermute, dass einige Codeanalysetools auch nicht intelligent genug sind, um die vererbte Virtualität zu erkennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X