2011-04-03 10 views
6

He intentado comprender pero todavía no estoy seguro. Si hay un constructor en la clase base, ¿las clases derivadas siempre lo llamarán? Sé que pueden anularlo (no es el término correcto aquí, lo sé, me refiero a agregar código a sus constructores), pero supongo que si el constructor está definido en la clase base, los derivados siempre lo llamarán. ¿Es eso cierto?Herencia de constructores

Respuesta

6

Sí, si hay un constructor sin parámetros, siempre se llamará. Si hay más de un constructor, puede elegir cuál de ellos para llamar con la palabra clave base:

class Parent { 
    public Parent() {} 
    public Parent(int x) {} 
} 

class Child : Parent { 
    public Child(int x) : base(x) { 
    } 
} 

si hay ningún constructor sin parámetros, usted será obligados para hacer esto:

class Parent { 
    public Parent(int x) {} 
} 

class Child : Parent { 
    // This will not compile without "base(x)" 
    public Child(int x) : base(x) { 
    } 
} 
+0

No estoy seguro de obtenerlo. En el primer ejemplo, hay Child (int x): base (x), ¿así que supongo que se llamarán ambos? – Miria

+0

@Miria: Sí. No hay forma de que * algún * constructor base no se invoque (por ejemplo, en el segundo ejemplo, el compilador no le permitirá eliminar 'base (x)'); usar 'base' solo le permite elegir * a cuál se llamará, y con qué parámetros. – Jon

2

Si solo hay un constructor sin parámetros en la clase base, el constructor de clases hijo siempre lo llamará primero. Por otro lado, si tiene otros constructores definidos en la clase base, entonces la clase hija tendrá una opción a la que basar el constructor para llamar.