es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pregunta sobre la sobrecarga de constructores y la herencia en C++

Intento familiarizarme con la herencia en C++. Intenté sobrecargar un constructor de la clase base en una clase heredada.
Puedo ver que llamo al constructor base correcto desde mi clase heredada, pero después los valores inicializados están vacíos/no se reflejan en la clase heredada.

He leído muchas respuestas sobre esta pregunta en stackoverflow, pero no estoy seguro de por qué las variables de la clase base no son accesibles para la clase heredada.

#include <iostream>
#include <string>

using namespace std;
class person {
public:
  string name, surname;
  int age;

  person() {
    name = "";
    surname = "";
    age = 0;
  }
  person(string iName, string iSurname, int iAge) {
    setName(iName);
    setSurname(iSurname);
    setAge(iAge);
  }

  void setName(string iName) { name = iName; }
  void setSurname(string iSurname) { surname = iSurname; }
  void setAge(int iAge) { age = iAge; };
  string returnPerson() {
    return name + " " + surname + " " + to_string(age) + "\n";
  }
};

class personExtended : public person {
public:
  string job;

  using person::person;
  personExtended() {
    person();
    job = "";
  }
  personExtended(string iName, string iSurname, int iAge, string iJob) {
    person(iName, iSurname, iAge);
    setJob(iJob);
  }
  void setJob(string iJob) { job = iJob; };
};

int main() {
  personExtended myPerson("Jon", "Arryn", 49, "Knight");
  cout << myPerson.returnPerson();
}

La salida será vacía.

Estaría encantado si alguien pudiera explicarme por qué los valores de la clase base se pierden al retornar la llamada del constructor de la clase base. ¿Mi enfoque está completamente equivocado?

¿Por qué las variables name/surname no se llenan si llamo al constructor de la clase base desde la clase heredada? Si llamo al constructor de la clase base funciona bien y, hasta donde entiendo, las variables públicas de la clase base, que son establecidas por el constructor de la clase base, también deberían estar disponibles para la clase heredada.

Gracias por ayudarme a entender C++ un poco mejor =)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el constructor de la clase heredada no llama correctamente al constructor de la clase base con los argumentos proporcionados. Al usar “using person::person;” en la definición de “personExtended”, esto solo importa el constructor sobrecargado de la clase base, pero no el constructor por defecto. Por lo tanto, al usar el constructor por defecto de “personExtended”, se llama al constructor por defecto de la clase base, que inicializa las variables con valores vacíos.

    Para llamar correctamente al constructor sobrecargado de la clase base, debería ser llamado explícitamente en la lista de inicializadores del constructor de “personExtended”:

    personExtended(string iName, string iSurname, int iAge, string iJob) : person(iName, iSurname, iAge) {
        setJob(iJob);
    }
    

    Esto garantiza que las variables se inicialicen correctamente con los valores proporcionados.

Comments are closed.