2010-07-02 14 views
21

Probabilmente è stato chiesto prima su SO, ma non sono riuscito a trovare una domanda simile.Devo specificare anche virtuale sui metodi delle sottoclassi?

Si consideri il seguente gerarchia di classe:

class BritneySpears 
{ 
    public: 

    virtual ~BritneySpears(); 
}; 

class Daughter1 : public BritneySpears 
{ 
    public: 

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

class Daughter2 : public BritneySpears 
{ 
    public: 

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

C'è una differenza tra Daughter1 e Daughter2 classi?

Quali sono le conseguenze di specificare/non specificare virtual su un distruttore/metodo di sottoclasse?

Grazie.

+2

Nota per i lettori: dare un'occhiata anche alla parola chiave [override'] (http://stackoverflow.com/questions/13880205/override-in-c11) in C++ 11 che è strettamente correlata a quell'argomento. – ereOn

risposta

28

No tecnicamente non è necessario specificare virtual. Se il metodo base è virtuale, C++ eseguirà automaticamente il metodo di sovrascrittura corrispondente virtual.

Tuttavia è necessario contrassegnarli virtual. Il metodo è dopotutto virtual e rende il tuo codice molto più chiaro e più facile da seguire da altri sviluppatori.

+0

Molte buone risposte qui. Ho scelto il più popolare :) Grazie a tutti voi. – ereOn

6

Virtual viene rilevato automaticamente sulle sovrascritture del metodo derivato indipendentemente dal fatto che lo si specifichi nella classe figlio.

La conseguenza principale è che senza specificare il virtual nel child è più difficile vedere dalla definizione della classe figlio che il metodo sia effettivamente virtuale. Per questo motivo, specifica sempre virtuale in entrambe le classi genitore e figlio.

8

You do not need it, ma contrassegnarlo in modo da rendere più chiaro il codice.

Nota: se la classe base ha un virtual distruttore, allora il vostro distruttore è automaticamente virtuale. Potresti aver bisogno di un distruttore esplicito per altri motivi , ma non è necessario per redeclare un distruttore semplicemente per rendere sicuro che sia virtuale. Indipendentemente dal fatto che lo si chiami con la parola chiave virtuale , dichiararla senza la parola chiave virtuale o non dichiararla , è ancora virtuale.

Problemi correlati