2012-04-02 15 views
20

Ho una dichiarazione in un cpp in cui una funzione è simile:Differenza tra virtuale void funcFoo() const = 0 e virtuale void funcFoo() = 0;

virtual void funcFoo() const = 0; 

Suppongo che può essere ereditata da un'altra classe se è stata espressa esplicitamente, ma qual è la differenza tra

virtual void funcFoo() = 0; 

è importante per migliorare la mia programmazione e voglio sapere la differenza. Non voglio un malfunzionamento causato da una cattiva ereditarietà.

Grazie in anticipo.

+2

http://stackoverflow.com/questions/ 751681/meaning-of-const-last-in-AC-method-declaration – vid

+4

Risposta breve: 'const' correctness. – iammilind

risposta

31

La prima firma indica che il metodo può essere chiamato su un'istanza const di un tipo derivato. La seconda versione non può essere chiamata su istanze const. Sono diverse firme, quindi implementando il secondo, non state implementando o sovrascrivendo la prima versione.

struct Base { 
    virtual void foo() const = 0; 
}; 

struct Derived : Base { 
    void foo() { ... } // does NOT implement the base class' foo() method. 
}; 
+7

+1 per aver menzionato che non si escludono a vicenda. –

+3

no, è il contrario: la prima funzione può essere chiamata su istanze const e non const, mentre la seconda solo su istanze non const (so che è complicata, ho sbagliato anche la prima volta :-) –

+0

ottima spiegazione! – BajaBob

11

La differenza è che la prima funzione può essere richiamata sugli oggetti const, mentre il secondo no. Inoltre, la prima funzione può chiamare solo altre funzioni membro const sullo stesso oggetto. Per quanto riguarda l'ereditarietà, si comportano allo stesso modo.

Vedere anche lo C++ FAQ su questo argomento.

3

Le due funzioni virtuali hanno diverse firme ma l'ereditazione funzionerà allo stesso modo. Il primo è un metodo const e può supportare solo operazioni const (metodi) e oggetti.

1

metodi const non possono cambiare lo stato dell'oggetto in modo che il

virtual void funcFoo() const = 0; 

sarà chiamato in casi const di questa classe, con la differenza di

virtual void funcFoo() = 0; 

che potrebbe chiamarsi solo in istanze non costanti. Prova a google per la logica const in C++. http://en.wikipedia.org/wiki/Const-correctness

14
virtual void funcFoo() const = 0; 
- You can't change the state of the object 
- You can call this function via const objects 
- You can only call another const member functions on this object 

virtual void funcFoo() = 0; 
- You can change the state of the object 
- You can't call this function via const objects 

Il miglior tutorial o Faq Ho visto circa correctectness const era la FAQ C++ per parashift:

Date un'occhiata: http://www.parashift.com/c++-faq-lite/const-correctness.html

+0

Questa è la migliore risposta. L'unica cosa che confondo è capire quale sia l'oggetto 'const' .. –

Problemi correlati