2013-06-26 12 views
6

In questo codice:Una funzione virtuale può essere sovrascritta da una funzione non virtuale?

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

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

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

C'è qualche differenza tra Derived1 e Derived2?

+3

'Derived2 :: method2' è virtuale. –

+0

se la sintassi lo consente. (non controllato) allora 'derived2-> method()' sarà anche virtuale (implicito però) – Alex

+0

@ R.MartinhoFernandes: Quindi la parola chiave virtuale è implicita? – Eric

risposta

16

Dalla sezione 10.3 funzioni virtuali del C++ 11 standard (progetto n3337) il punto 2:

Se una funzione membro virtual vf è dichiarato in una classe base e in una classe derivata, derivate direttamente o indirettamente da dalla base, una funzione membro vf con lo stesso nome, lista-tipo-parametro (8.3.5), qualifica cv e refqualifier (o assenza dello stesso) come Base :: vf è dichiarato, quindi Derived :: vf è anche virtuale (anche se non è così dichiarato) e sovrascrive Base :: vf.

Così Derived2::method è anche virtual, anche se non è esplicitamente dichiarato come tale.

+0

È mai desiderabile dichiarare il membro senza la parola chiave virtuale? Si può fare GCC per sputare un avviso quando ciò accade? – Eric

+0

@Eric: alcuni sostengono che il contrassegno della funzione derivata virtuale serva da documentazione, altri sostengono che si tratta di codice inutile. In pratica, non importa in alcun modo. –

+4

Con C++ 11 si può usare la parola chiave override per indicare che una funzione in una classe derivata è virtuale. –

4

Sono identici.

virtual è opzionale quando sovrascrive una funzione. È obbligatorio solo quando si contrassegna una funzione nella classe base.