2012-04-02 20 views
20

que tienen una declaración en un CPP, donde una función es igual:Diferencia entre virtual void funcFoo() const = 0 y virtual void funcFoo() = 0;

virtual void funcFoo() const = 0; 

que asumen que pueden ser heredados por otro ramo, si se declara explícitamente, pero ¿cuál es la diferencia entre

virtual void funcFoo() = 0; 

es importante para mí, mejorar mi programación y quiero saber la diferencia. No quiero un mal funcionamiento causado por una mala herencia.

Gracias de antemano.

+2

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

+4

Respuesta corta: 'const' correctness. – iammilind

Respuesta

31

La primera firma significa que se puede llamar al método en una instancia const de un tipo derivado. La segunda versión no se puede invocar en instancias const. Son firmas diferentes, por lo que al implementar el segundo, no está implementando o reemplazando la primera versión.

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

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

+1 por mencionar que no se anulan entre sí. –

+3

no, es al revés: la primera función se puede invocar tanto en las instancias const como en las no const, mientras que la segunda solo en las instancias no const (sé que es complicado, también lo entendí la primera vez :-) –

+0

¡gran explicación! – BajaBob

11

La diferencia es que la primera función se puede invocar en los objetos const, mientras que la segunda no. Además, la primera función solo puede llamar a otras funciones miembro const en el mismo objeto. En cuanto a la herencia, se comportan de la misma manera.

Véase también el C++ FAQ sobre este tema.

3

Las dos funciones virtuales tienen firmas diferentes pero la herencia funcionará de la misma manera. El primero es un método const y solo puede admitir operaciones const (métodos) y objetos.

1

métodos const no pueden cambiar el estado del objeto por lo que la

virtual void funcFoo() const = 0; 

será llamado en casos const de esta clase con la diferencia de

virtual void funcFoo() = 0; 

que podría llamarse solo en instancias no constantes. Intenta buscar la lógica de const en google en 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 

El mejor tutorial o Faq que he visto sobre correctectness const fue el FAQ C++ por parashift:

Echale un vistazo: http://www.parashift.com/c++-faq-lite/const-correctness.html

+0

Esta es la mejor respuesta. Lo único que hago es entender qué es el objeto 'const' ... –

Cuestiones relacionadas