2010-12-04 21 views
10

he reducido mi problema hasta el siguiente código de ejemplo:constructor predeterminado de una clase heredada

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n); 
}; 

MewTwo::MewTwo(int n) {} 

que produce un error:

no matching function for call to ‘pokemon::pokemon()’

Lo que piensan que ocurre es que se llama a un constructor predeterminado para pokemon cuando intento escribir el constructor MewTwo, que no existe. Soy relativamente nuevo en C++, así que estoy adivinando aquí. ¿Algunas ideas?

Restricción: las soluciones no pueden modificar ni agregar miembros públicos a las clases.

Respuesta

13

En realidad lo que busca es la lista de miembros de inicialización. Cambie el constructor de clase heredado a lo siguiente:

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) : pokemon(n) {} 
}; 

Usted tuvo razón al identificar lo que estaba pasando. Básicamente, cuando creas la clase heredada, primero creas la clase base y no puedes hacer eso porque no hay un constructor predeterminado definido. Las listas de inicialización de miembros lo ayudan a evitarlo :)

¡Revise: http://www.cprogramming.com/tutorial/initialization-lists-c++.html para obtener más ejemplos!

+1

Nunca he oído hablar de listas de inicialización de miembros, gracias por el enlace tiene mucho sentido ahora. :) – Coltin

5

Prueba esto:

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) :pokemon(n){} 
}; 
+4

+1. Las clases base y los miembros se inicializan antes de que se ejecute el código de constructor de una clase derivada. Si no desea que se use el constructor predeterminado para este fin, debe especificar qué constructor usar y qué parámetros aprobar. Esto se hace con la lista de inicialización, como se muestra. En la clase base, definió un constructor, que suprime la creación de un constructor predeterminado. –

Cuestiones relacionadas