2010-12-10 18 views
6
class Base 
{ 
public: 
Base() 
{ 
cout<<"base class"<<endl; 
fun(); 
} 
virtual void fun(){cout<<"fun of base"<<endl;} 
}; 

class Derive:public Base 
{ 
public: 
Derive() 
{ 
cout<<"derive class"<<endl; 
fun(); 
} 
void fun(){ cout<<"fun of derive"<<endl;} 
}; 

void main() 
{ 
Derive d; 
} 

La salida es:¿Por qué mi método virtual no se reemplaza?

base class 
fun of base 
derive class 
fun of derive 

Por qué la segunda línea no es fun of derive?

+3

Material de lectura: ["Nunca llamar a las funciones virtuales durante la construcción o destrucción"] (http://www.artima.com/cppsource/nevercall.html). –

Respuesta

4

Cuando se llama a fun() en el constructor de la clase base, la clase derivada tiene aún no se ha construido (en C++, las clases son un padre construido primero) por lo que el sistema no tiene una instancia de derivada todavía y, por consiguiente, no hay entrada en la tabla de funciones virtuales para Derived::fun().

Esta es la razón por la cual llama a las funciones virtuales en constructores en general, no están bien vistas a menos que específicamente desea llamar la implementación de la función virtual que es ya sea parte del objeto que se está instanciada o parte de uno de sus antepasados.

2

Debido a que usted lo escribió así ... Su llamada al constructor de la clase derivada hace:

- Base Class Constructor call 
    | 
    Call to **fun of Base Class** 
- Derived Class Constructor call 
    | 
    Call to **fun of the Derived Class** 

Más detalles here

+0

¿No es un método virtual en la clase base siempre anulado por un método derivado con la misma firma, incluso en el constructor? – yoyo

+0

Sí, pero la respuesta acaba de ser dada por Timo :) –

Cuestiones relacionadas