2013-06-26 7 views
6

In diesem Code:Kann eine virtuelle Funktion durch eine nicht-virtuelle Funktion überschrieben werden?

class Base { 
public: 
    virtual void method() = 0; 
}; 

class Derived1 : public Base{ 
public: 
    virtual void method() override { } 
}; 

class Derived2 : public Base{ 
public: 
    void method() override { } 
}; 

Gibt es einen Unterschied zwischen Derived1 und Derived2?

+3

'Derived2 :: method2' ist virtuell. –

+0

wenn Syntax es erlaubt. (nicht angehakt) dann wird 'derived2-> method()' auch virtuell sein (implizit) – Alex

+0

@ R.MartinhoFernandes: Also ist das virtuelle Schlüsselwort impliziert? – Eric

Antwort

16

Aus dem Bereich 10.3 Virtuelle Funktionen der C++ 11-Standard (Entwurf n3337) Punkt 2:

Wenn eine virtuelle Memberfunktion vf in einer Klasse Basis und in einer Klasse abgeleitet deklariert wird, abgeleitet direkt oder indirekt von Base, eine Memberfunktion vf mit dem gleichen Namen, Parameter-type-list (8.3.5), cv-qualification und refqualifier (oder das Fehlen derselben) wie Base :: vf wird deklariert, dann Abgeleitet :: vf ist auch virtuell (ob es so deklariert ist) und es überschreibt Base :: vf.

So Derived2::method ist auch virtual, auch wenn sie nicht explizit als solche deklariert.

+0

Ist es immer wünschenswert, das Mitglied ohne das virtuelle Schlüsselwort zu deklarieren? Kann GCC dazu gebracht werden, eine Warnung auszuspucken, wenn das passiert? – Eric

+0

@Eric: Einige argumentieren, dass das Markieren der abgeleiteten virtuellen Funktion dient als Dokumentation, andere argumentieren, dass es unnötig Code Bloat ist. In der Praxis spielt es in keiner Weise eine Rolle. –

+4

Mit C++ 11 kann man das Schlüsselwort override verwenden, um anzuzeigen, dass eine Funktion in einer abgeleiteten Klasse virtuell ist. –

4

Sie sind identisch.

virtual ist optional beim Überschreiben einer Funktion. Dies ist nur erforderlich, wenn Sie eine Funktion in der Basisklasse markieren.