simple programacion poo polimorfismo multiple herencia constructores codigo ats c++ inheritance gcc constructor

programacion - polimorfismo c++ codigo



Heredar constructores (6)

Por qué este código:

class A { public: explicit A(int x) {} }; class B: public A { }; int main(void) { B *b = new B(5); delete b; }

Resultado en estos errores:

main.cpp: In function ‘int main()’: main.cpp:13: error: no matching function for call to ‘B::B(int)’ main.cpp:8: note: candidates are: B::B() main.cpp:8: note: B::B(const B&)

¿No debería B heredar el constructor de A?

(esto está usando gcc)


¿Qué hay de usar una función de plantilla para enlazar a todos los constructores?

template <class... T> Derived(T... t) : Base(t...) {}


Debe definir explícitamente el constructor en B y llamar explícitamente al constructor para el padre.

B(int x) : A(x) { }

o

B() : A(5) { }


El código correcto es

class A { public: explicit A(int x) {} }; class B: public A { public: B(int a):A(a){ } }; main() { B *b = new B(5); delete b; }

El error es b / c. La clase B no tiene constructor de parámetros y, en segundo lugar, debe tener el inicializador de la clase base para llamar al constructor del parámetro de la clase base.


En C ++ 03 los constructores estándar no se pueden heredar y es necesario heredarlos uno por uno llamando a la implementación base por su cuenta. Si su compilador es compatible con el estándar C ++ 11, existe una herencia de constructor. Para más información, consulte el artículo de Wikipedia C ++ 11 . Con el nuevo estándar escribes:

class A { public: explicit A(int x) {} }; class B: public A { using A::A; };


Esto es directamente de la página de Bjarne Stroustrup :

Si así lo desea, puede dispararse en el pie heredando constructores en una clase derivada en la que defina nuevas variables miembro que necesitan inicialización:

struct B1 { B1(int) { } }; struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x; }; void test() { D1 d(6); // Oops: d.x is not initialized D1 e; // error: D1 has no default constructor }


Los constructores no son heredados. El constructor hijo los llama implícita o explícitamente.

El compilador crea un constructor predeterminado (uno sin argumentos) y un constructor de copia predeterminado (uno con un argumento que es una referencia del mismo tipo). Pero si quiere un constructor que acepte un int, debe definirlo explícitamente.

class A { public: explicit A(int x) {} }; class B: public A { public: explicit B(int x) : A(x) { } };

ACTUALIZACIÓN : en C ++ 11, los constructores se pueden heredar. Ver la respuesta de Suma para más detalles.