En C++ no es un concepto de la lista de inicialización del constructor, que es donde se puede y debe llamar a la constructor de la clase base y en el que también debe inicializar los miembros de datos. La lista de inicialización viene después de la firma del constructor después de dos puntos y antes del cuerpo del constructor. Digamos que tenemos una clase A:
class A : public B
{
public:
A(int a, int b, int c);
private:
int b_, c_;
};
Entonces, suponiendo que B tiene un constructor que toma un int, el constructor de A puede tener este aspecto:
A::A(int a, int b, int c)
: B(a), b_(b), c_(c) // initialization list
{
// do something
}
Como se puede ver, el constructor de la la clase base se llama en la lista de inicialización. Por cierto, la inicialización de los miembros de datos en la lista de inicialización es preferible a la asignación de los valores de b_, y c_ dentro del cuerpo del constructor, porque está ahorrando el costo adicional de la asignación.
Tenga en cuenta que los miembros de datos siempre se inicializan en el orden en que se declaran en la definición de clase, independientemente de su orden en la lista de inicialización. Para evitar errores extraños, que pueden surgir si sus miembros de datos dependen el uno del otro, siempre debe asegurarse de que el orden de los miembros sea el mismo en la lista de inicialización y la definición de la clase. Por la misma razón, el constructor de la clase base debe ser el primer elemento en la lista de inicialización. Si lo omite por completo, entonces se llamará automáticamente al constructor predeterminado para la clase base. En ese caso, si la clase base no tiene un constructor predeterminado, obtendrá un error de compilación.
quité 'explícito' del constructor de la superclase. A pesar de ser una mejor práctica para los constructores de argumento único, no estaba relacionado con la discusión en cuestión. Para obtener más información sobre la palabra clave explícita, consulte: http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx – luke
colon: operador que utilizó para invocar el constructor de la clase superior antes de instanciar el elemento secundario constructor de clase, supongo que esto también es cierto para los métodos? – ha9u63ar
@hagubear, solo válido para constructores, AFAIK – luke