2012-02-28 34 views
13
class Base 
{ 
    public: 
    virtual void func() const 
    { 
    cout<<"This is constant base "<<endl; 
    } 
}; 

class Derived : public Base 
{ 
    public: 
    virtual void func() 
    { 
    cout<<"This is non constant derived "<<endl; 
    } 
}; 


int main() 
{ 
    Base *d = new Derived(); 
    d->func(); 
    delete d; 

    return 0; 
} 

¿Por qué la salida imprime "Esta es una base constante". Sin embargo, si elimino const en la versión base de func(), se imprime "Esto no deriva de la constante"función virtual const vs función virtual no const

d-> func() debería llamar a la versión Derivada correcta, incluso cuando el Func base() sea const right ?

+0

Posible duplicado de http://stackoverflow.com/questions/7504300, http://stackoverflow.com/questions/3827374, y http://stackoverflow.com/questions/4152799. –

+0

posible duplicado de [función virtual que es const en la clase base y no const en el derivado] (http://stackoverflow.com/questions/7504300/virtual-function-that-is-const-in-the-base- class-and-not-const-in-the-derived) –

Respuesta

28
virtual void func() const //in Base 
virtual void func()  //in Derived 

const parte es en realidad una parte de la firma de función, lo que significa la clase derivada define una función nuevo en lugar de anulando la función de la clase base. Es porque sus firmas no coinciden.

Cuando se quita la parte const, entonces su firma partidos, y luego compilador ve la definición de clase derivada de func como versión sustituida de la función de la clase base func, por lo tanto, la función de la clase derivada se llama si el tipo de tiempo de ejecución de el objeto es Derived tipo. Este comportamiento se llama polimorfismo en tiempo de ejecución.

+0

Estoy confundido aquí. Si ambos se tratan como 2 funciones diferentes, ¿por qué d-> func() llama a la versión derivada, ya que no hay const aplicable aquí? – vamsi

+1

Derecha. Y, de hecho, es bastante común que una clase defina dos funciones idénticas, una 'const' y otra no. –

+2

@vamsi, la definición de 'Base' solo contiene una función, así que esa es la que se llama. –

3

No, porque virtual void func() no reemplaza a virtual void func() const.

4

virtual void func() es en realidad de una firma diferente de virtual void func() const. Por lo tanto, no anuló su función base original de solo lectura. Terminaste creando una nueva función virtual en Derived.

También puede obtener más información sobre esto si alguna vez intenta crear punteros a funciones miembro (PTMF), pero eso es una necesidad poco común (sin embargo, podría ser útil para estudiar o practicar).

La palabra clave de anulación en C++ 11 es especialmente útil para evitar este tipo de errores. El compilador le dirá que su definición de 'func' en derivada no anula nada.

Cuestiones relacionadas