2012-04-16 22 views
5

Considérese una Waldo clase, que hereda de Foo y Baz, a saber .:¿Funciona? C++ herencia múltiple y constructor de encadenamiento

class Waldo : public Foo, public Baz { 
    ... 
}; 

Al crear una nueva instancia de Waldo:

Waldo *w = new Waldo; 

hacer lo Foo y ¿Se llama a los constructores de Baz? Si no se llaman por defecto, ¿hay una manera fácil EN LA DECLARACIÓN DE CLASE O EN LA DECLARACIÓN/DEFINICIÓN del constructor de Waldo para forzarlos a ser llamados?

(que parece que puede estar tratando de hacer el encadenamiento de constructor, y C++ supuestamente no hace eso. No estoy seguro.)

Lo que estoy tratando de hacer es "anotaciones" diversas clases declaraciones, donde las anotaciones causan (entre otras cosas) instancias de la clase anotada para vincularse en listas mantenidas por las clases de anotación. Esto me permite, por ejemplo, recorrer la lista de todos los objetos con Baz-nature, aplicarles una determinada operación y no tener que preocuparme si recordé agregar la instancia a la lista de objetos con Baz-nature, porque el constructor lo hizo automágicamente.

+1

Nota: el uso de 'new' aquí es falsa, se podría decir' perfectamente Waldo w; 'y una instancia de 'Waldo' sería creado. –

Respuesta

1

Los constructores de todos los miembros de una clase se invocan en el orden en que se declaran en la clase.

Los constructores por defecto de las clases derivadas llaman a los constructores de la clase base de manera predeterminada. Si necesitan argumentos, necesitan ser invocado explícitamente otra cosa es un error ...

class Employee { 
private: 
    // 
public: 
    Employee(); 
    //... 
}; 



class Manager: public Employee { 
private: 
    short level; 
public: 
    Manager(): Employee(), level() {} // This is the default constructor, it calls Employee(). 
    // The definition is equivalent to default constructor of Manager.. 
    //... 
    }; 
+0

Respuesta y explicación buenas y detalladas. ¡Gracias! –

7

Sí, se llaman así. De izquierda a derecha.