usar significa reservada relaciones que programacion palabra orientada objetos metodo hijo herencia entre como clases clase c++ constructor initialization derived-class

c++ - significa - Error: el constructor de la clase base debe inicializar explícitamente el constructor de la clase padre



relaciones entre clases y objetos en java (5)

Soy nuevo en c ++. Cuando intento compilar el código de abajo, recibo este error

constructor for ''child'' must explicitly initialize the base class ''parent'' which does not have a default constructor child::child(int a) {

aqui esta mi clase

#include<iostream> using namespace std; class parent { public : int x; parent(int a); int getX(); }; parent::parent(int a) { x = a; } int parent::getX() { return x; } class child : public parent { public: child(int a); }; child::child(int a) { x = a; } int main(int n , char *argv[]) { }

¿Por qué estoy recibiendo este error? Cómo puedo resolverlo ? Gracias por adelantado


A riesgo de repetir el mensaje de error que recibió: un constructor de clase hijo debe invocar el constructor de su padre.

El compilador agregará una invocación automática del constructor predeterminado (sin argumentos) del padre. Si el padre no tiene un constructor predeterminado, debe invocar explícitamente uno de los constructores que tiene usted mismo.

El compilador debe hacer cumplir esto para garantizar que la funcionalidad que la clase secundaria ha heredado de la principal está configurada correctamente ... por ejemplo, inicializando cualquier variable privada que la secundaria haya heredado de la principal, pero no puede acceder directamente. Aunque su clase no tiene este problema, debe seguir las reglas.

Aquí hay algunos ejemplos de constructores en clases que usan herencia:

Esto está bien, ParentA tiene un constructor predeterminado:

class ParentA { }; class ChildA { public: ChildA() {} };

Esto no está bien; ParentB no tiene un constructor predeterminado, por lo que la clase ChildB1 debe llamar explícitamente a uno de los constructores:

class ParentB { int m_a; public: ParentB(int a) : m_a(a) {} }; class ChildB1 : public ParentB { float m_b; public: // You''ll get an error like this here: // "error: no matching function for call to ‘ParentB::ParentB()’" ChildB1 (float b) : m_b(b) {} };

Esto está bien, estamos llamando explícitamente al constructor de ParentB:

class ChildB2 : public ParentB { float m_b; public: ChildB2(int a, float b) : ParentB(a), m_b(b) {} };

Esto está bien, ParentC tiene un constructor predeterminado que se llamará automáticamente:

class ParentC { int m_a; public: ParentC() : m_a(0) {} ParentC(int a) : m_a(a) {} }; class ChildC: public ParentC { float m_b; public: ChildC(float b) : m_b(b) {} };


Cuando inicializa un objeto de una clase derivada, la parte de la clase base debe construirse primero. Si no lo inicializa usted mismo en el constructor de la clase derivada llamando a uno de sus constructores, el compilador intentará usar el constructor predeterminado de la clase base. En su caso, el constructor predeterminado no está definido porque ya proporcionó un constructor personalizado.

Para resolver esto, deberá proporcionar un constructor predeterminado para la clase base o simplemente llamar a su constructor en la lista de inicializadores del constructor de la clase derivada:

child::child(int a) : parent(a) { }


Hola. Solo intente agregar el constructor predeterminado en su clase principal (sin constructor de argumentos) y luego compílelo. Espero que esto pueda resolver su problema.


La clase padre tiene un constructor explícito, por lo que el compilador no le agregará un constructor ''vacío'' implícito. Además, su constructor tiene un parámetro, por lo que el compilador no puede generarle una llamada implícita. Por eso debes hacerlo explícitamente.

De esta manera:

child::child(int a) : parent(a) { }


Otro ejemplo donde se deriva una clase de MyBook de la clase base Libro. Ahora se proporciona un constructor personalizado con dos argumentos para el constructor de la clase base, por lo tanto, no hay un constructor predeterminado para la clase base. Cuando se encuentra dentro de la función principal, se crea una novela objeto de clase derivada, al principio el compilador intentará invocar el constructor de la clase base que no existe. Por lo tanto, el constructor de la clase base debe llamarse explícitamente desde el constructor de la clase derivada para inicializar cualquier variable privada que la clase derivada haya heredado de la clase base pero no puede acceder directamente (por ejemplo, la cadena de título). Como mencionó el usuario , necesitamos seguir estas reglas. Puede obtener información más detallada de la buena explicación de las listas de inicialización de Alex Allain . Por lo tanto, las listas de inicialización deben ser requeridas cuando no hay un constructor de dafault definido y también para inicializar miembros constantes. El resume-

Antes de ejecutar el cuerpo del constructor, se invocan todos los constructores para su clase principal y luego para sus campos. Por defecto, los constructores sin argumentos son invocados. Las listas de inicialización le permiten elegir a qué constructor se llama y qué argumentos recibe ese constructor.

#include <iostream> #include <cstdio> using namespace std; class Book { private: string title; protected: string author; public: Book(string t, string a) { title = t; author = a; }; virtual void display() = 0; }; class MyBook : public Book { private: const string className; protected: int price; public: // Book(t,a) needs to be called before the {} block to initialize, otherwise error (does not match to Book::Book() default constructor will occur) MyBook(string t, string a, int p) : Book(t, a), className("MyClass"), price(p){ }; void display() { cout << "Title: " << getTitle() << endl; cout << "Author: " << author << endl; cout << "Price: " << price << endl; }; }; int main() { string title, author; int price; getline(cin, title); getline(cin, author); cin >> price; MyBook novel(title, author, price); novel.display(); return 0; }