2010-07-02 6 views
21

Dies wurde wahrscheinlich schon früher bei SO gefragt, aber ich konnte keine ähnliche Frage finden.Muss ich für die Unterklassen auch Methoden virtuell angeben?

die folgende Klassenhierarchie vor:

class BritneySpears 
{ 
    public: 

    virtual ~BritneySpears(); 
}; 

class Daughter1 : public BritneySpears 
{ 
    public: 

    virtual ~Daughter1(); // Virtual specifier 
}; 

class Daughter2 : public BritneySpears 
{ 
    public: 

    ~Daughter2(); // No virtual specifier 
}; 

Gibt es einen Unterschied zwischen Daughter1 und Daughter2 Klassen?

Welche Konsequenzen hat die Angabe/nicht Angabe von virtual für eine Unterklasse destructor/method?

Danke.

+2

Hinweis für Leser: Werfen Sie auch einen Blick auf das Schlüsselwort ['override'] (http:// Stackoverflow.com/questions/13880205/override-in-c11) in C++ 11, das eng verwandt ist dieses Thema. – ereOn

Antwort

28

Nein, Sie müssen technisch virtual nicht angeben. Wenn die Basismethode virtuell ist, erstellt C++ automatisch die passende Überschreibungsmethode virtual.

Allerdings sollten Sie sie markieren virtual. Die Methode ist virtual schließlich und es macht Ihren Code viel klarer und leichter von anderen Entwicklern zu folgen.

+0

Viele gute Antworten hier. Ich wählte die beliebtesten :) Danke an euch alle. – ereOn

6

Virtual wird bei abgeleiteten Methodenüberschreibungen automatisch übernommen, unabhängig davon, ob Sie es in der untergeordneten Klasse angeben.

Die wichtigste Konsequenz ist, dass es ohne Angabe von virtual im Child unter der Kind-Klassendefinition schwieriger zu sehen ist, dass die Methode tatsächlich virtuell ist. Aus diesem Grund gebe ich immer virtuell in den Eltern- und Kindklassen an.

8

You do not need it, aber die Kennzeichnung könnte Ihren Code klarer machen.

Hinweis: Wenn Sie Ihre Basisklasse eine virtuelle destructor hat, dann destructor ist automatisch virtuell. Sie benötigen möglicherweise einen expliziten Destruktor für andere Gründe, aber es ist nicht notwendig, redeclare einen Destruktor einfach zu machen sicher, es ist virtuell. Egal ob deklarieren Sie es mit dem virtuellen Schlüsselwort , deklarieren Sie es ohne das virtuelle Schlüsselwort , oder deklarieren Sie es nicht überhaupt, es ist immer noch virtuell.

Verwandte Themen