que programacion poo polimorfismo orientada objetos objeto herencia ejemplos constructores c++ gcc virtual virtual-inheritance

poo - programacion orientada a objetos c++



herencia virtual c++ (3)

Necesita llamar explícitamente al constructor para Base desde C:

class C : public A, public B { public: C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} /*... */ };

Problema:

class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ };

En la posición dada, gcc se queja de que no puede hacer coincidir la llamada de función a Base (), es decir, el constructor predeterminado. Pero C no hereda directamente de Base, solo a través de A y B. Entonces, ¿por qué gcc se queja aquí?

Ideas? TIA / Rob


Si declaras un constructor personalizado, el constructor predeterminado está deshabilitado. En la herencia virtual, debe llamar directamente al constructor virtualmente heredado porque de lo contrario no sabría si inicializar por A o por B.


virtual clases base virtual son especiales porque son inicializadas por la clase más derivada y no por ninguna clase base intermedia que herede de la base virtual. ¿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.

Tenga en cuenta que se permite el uso de un identificador de base virtual en la lista de inicializadores de un constructor, incluso si no es una base directa de la clase en cuestión.