Frage

Während durch einige alte Code Schleppen ich etwas las, ähnlich dem folgenden:

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

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

Der Code kompiliert fein (MS VS2008) ohne Warnungen (Stufe 4) und es funktioniert wie erwartet - Func virtuell ist, obwohl die virtuelle Qualifier in der abgeleiteten Klasse fehlt. Nun, anders als einige Verwirrung verursacht, gibt es Gefahren, die mit diesem Code oder soll ich es ändert alle, Hinzufügen des virtual Qualifier?

War es hilfreich?

Lösung

Die virtual wird in abgeleiteten Klassen für alle übergeordneten Funktionen mitgerissen. Der einzige wirkliche Vorteil des Schlüsselwort hinzuzufügen, ist Ihre Absicht, einen zufälligen Beobachter der abgeleiteten Klasse Definition bedeuten wird sofort wissen, dass Func virtuell ist.

Auch Klassen, die virtuellen Func Methoden haben Abgeleitet erweitern.

Referenz: Virtuelle Funktionen auf MSDN. Blättern Sie in der Seite zu sehen

  

Das virtuelle Schlüsselwort kann verwendet werden, wenn   erklärt vorrangige Funktionen in einem   abgeleiteten Klasse, aber es ist nicht notwendig;   Überschreibungen von virtuellen Funktionen sind   immer virtuell.

Andere Tipps

Hier ist eine interessante Folge von nicht zwingenden Funktionen virtuell zu deklarieren, um:

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

Ob f des Abgeleitet virtuell sein wird hängt davon ab, ob Abgeleitet instanziiert mit einer Base mit einer virtuellen Funktion f der rechten Unterschrift.

Jemand hat mir einmal gesagt, dass es sehr alten C ++ Compiler, nicht der Spezifikation entsprechen, erfordern virtuelle für alle Unterklassen festgelegt werden. Das ist kein Problem mehr.

Eine Gefahr, diese Praxis zu folgen ist, dass die Menschen können nicht erkennen, sie das Schlüsselwort virtual auf Funktionen müssen die virtuellen sein sollen. Dies ist höchstwahrscheinlich Menschen aus Sprachen kommen, wo es kein Konzept der nicht-virtuellen Funktionen (zB: Java, Realbasic). Als logische Folge, kann man nicht sagen, wann virtuellen bewusst verzichtet worden, da eine Funktion als nicht-virtuelle soll.

Ich vermute, dass einige Code-Analyse-Tools möglicherweise nicht auch intelligent genug sein, um die geerbte Virtua aufzunehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top