2010-08-19 14 views
16

¿Es posible tener herencia virtual para la clase que no proporciona el constructor predeterminado?Constructor predeterminado y herencia virtual

El presente diagrama de diamantes (el más simple con el único cambio de ningún constructor predeterminado proporcionado) no compila (g ++ 4.4.3).

class A { 
public: 
    A(int) {} 
}; 
class B : virtual public A { 
public: 
    B(int i) : A(i) {} 
}; 
class C : virtual public A { 
public: 
    C(int i) : A(i) {} 
}; 
class D : public B, public C { 
public: 
    D(int i) : B(i), C(i) {} 
}; 

Gracias, Francesco

Respuesta

3

creo que la clase D también tiene que llamar explícitamente constructor A 's en su lista de inicialización.

22

es necesario llamar constructor A 's explícitamente aquí

D(int i) : A(i), B(i), C(i) {} 

clases base virtuales son especiales en que se inicializan por la clase más derivada y no por ninguna clase de base intermedia que hereda de lo virtual base. ¿Cuál de los potenciales inicializadores múltiples sería la elección correcta para inicializar una base?

Si la clase más derivada que se está construyendo no la incluye en su lista de integración de miembros, entonces la clase base virtual se inicializa con su constructor predeterminado que debe existir y ser accesible.

Desvergonzadamente copiado de here :-)

1

El artículo del Dr. Dobbs Multiple Inheritance Considered Useful explica varias maneras de tratar con esto. La recomendación es básicamente proporcionar los constructores por defecto y los métodos init(). Se añade más trabajo para B y C, pero impide D de tener que saber sobre A.

+1

Dejando D conscientes de A es, por supuesto, deseable. La solución 'init()', desafortunadamente, tiene un inconveniente: el constructor de A será llamado dos veces (una por B y C) que puede tener efectos secundarios (especialmente si se usan miembros estáticos). Además, si un desarrollador crea una 'clase D: public A {}', el método 'init()' no se puede llamar en absoluto, dejando el objeto en un estado no inicializado. – Marste

0

necesita constructo de explict llamada A de la siguiente:

D(int i) : A(i), B(i), C(i) {} 
Cuestiones relacionadas