2012-04-03 18 views
6

pregunta básica de C++ estoy bastante seguro. si tengo una clase base con un constructor que no toma parámetros, y solo inicializa algunos de los miembros protegidos, una clase derivada llamará instantáneamente a este constructor base si coincide con los parámetros (ilusión pero poco probable), y si no es así, ¿Hay alguna manera de forzarlo a que llame automáticamente a dicho constructor base desde la clase derivada SIN tener que decirle explícitamente que lo haga en la clase derivada? Pregunto porque estoy escribiendo un tipo de contenedor y hay algunos miembros protegidos que quiero inicializar a valores específicos inicialmente, y luego quiero derivar y manipular esta clase base para mis necesidades, pero no me gustaría un usuario externo tener que recordar llamar explícitamente al constructor base o establecer estos valores dentro de su propio constructor.cómo forzar a los constructores de la clase base a llamar en clases derivadas?

+1

Estoy un poco perdido con la redacción de su pregunta, pero si la clase base tiene un constructor predeterminado/sin argumentos, se ejecutará cuando Inicializa un objeto de clase derivado si no especifica explícitamente la inicialización de la clase base. – birryree

Respuesta

8

Sí, siempre se invoca el constructor base predeterminado a menos que se indique explícitamente lo contrario.

Por ejemplo:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
}; 

class B : A 
{ 
public: 
    B() {} 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

la Salida:

A 

Por "indique expresamente lo contrario" quiero decir que se puede llamar un constructor diferente de la clase derivada:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
    A(int) { std::cout << "AAA"; } 
}; 

class B : A 
{ 
public: 
    B() : A(1) {} //call A(int) 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

dará salida

AAA 

Importante si usted no tiene un constructor por defecto (que declarar un constructor no predeterminado y no una opción por defecto) o el constructor por defecto no es visible (marcado como private), es necesario llamar explícitamente a una constructor disponible en la clase derivada.

+0

digamos que la única clase de constructor A tiene, recibe un entero como parámetro, y luego la clase derivada tiene un constructor que también recibe un int único. ¿Se llamará también al constructor de la base por casualidad? ¿o un constructor solo se considera un constructor predeterminado si no tiene parámetros? – FatalCatharsis

+0

también, últimas ideas, si es al revés, donde definió un constructor con parámetros en B pero un constructor sin parámetros en A, ¿se llamaría al constructor de A? y también, que se llama primero, el constructor predeterminado de la clase base o el constructor predeterminado de la clase derivada. – FatalCatharsis

2

Si su clase base tiene un "constructor predeterminado" (un constructor que no toma parámetros, ya sea explícitamente provisto por usted o implícitamente provisto por el compilador porque no proporcionó ningún constructor explícitamente), entonces cada derivada El constructor de clases llamará automáticamente a eso a menos que especifiques que llaman a un constructor diferente.

(Si su base de clase no lo hace tienen un "constructor por defecto", ya que ha proporcionado uno o más constructores que toman parámetros y ningún constructor que no lo hace, entonces es una compilación de error para una constructor de clase derivada para no indicar el constructor de clase base que llama.)

Cuestiones relacionadas