objects multiple c++ inheritance constructor protected access-specifier

multiple - inheritance c++



C++: ¿Por qué el constructor de mi DerivedClass no tiene acceso al campo protegido de la BaseClass? (6)

Tengo un constructor que intenta inicializar un campo en una clase base. El compilador se queja. El campo está protegido, por lo que las clases derivadas deberían tener acceso.

//The base class: class BaseClass { public: BaseClass(std::string); BaseClass(const BaseClass& orig); virtual ~BaseClass(); const std::string GetData() const; void SetData(const std::string& data); protected: BaseClass(); std::string m_data; }; BaseClass::BaseClass(const std::string data) : m_data(data) { } BaseClass::BaseClass() { } BaseClass::BaseClass(const BaseClass& orig) { } BaseClass::~BaseClass() { } void BaseClass::SetData(const std::string& data) { m_data = data; } const std::string BaseClass::GetData() const { return m_data; } //The derived class: class DerivedClass : public BaseClass { public: DerivedClass(std::string data); DerivedClass(const DerivedClass& orig); virtual ~DerivedClass(); private: }; DerivedClass::DerivedClass(std::string data) : m_data(data) { } //ERROR HERE DerivedClass::DerivedClass(const DerivedClass& orig) { } DerivedClass::~DerivedClass() { }

// El error del compilador

DerivedClass.cpp: 3: error: la clase ''DerivedClass'' no tiene ningún campo llamado ''m_data''

Cualquier ayuda es muy apreciada. Gracias de antemano.


Debe llamar al constructor de la clase base de la siguiente manera:

DerivedClass::DerivedClass(std::string data) : BaseClass(data) { }

Cada clase debe estar a cargo de inicializar sus miembros.


El constructor de su clase derivada tiene acceso, pero no puede asignarlo en la lista de inicialización. Cambia el constructor a:

DerivedClass::DerivedClass(const std::string& data) : BaseClass(data) { }

Alternativamente, si no hay disponible ningún constructor de clase base adecuado y no puede agregar uno, puede cambiarlo a:

DerivedClass::DerivedClass(const std::string& data) { m_data = data; }


En la lista de inicializadores solo puede establecer valores para los atributos de la misma clase. Para acceder a él, debe atribuir el valor en el cuerpo del constructor:

DerivedClass :: DerivedClass (std :: string data) {m_data = data; }

O, si es caro copiar el objeto, pasa los m_data como un argumento al constructor de la clase padre:

DerivedClass :: DerivedClass (std :: string data): BaseClass (data) {}

Consejo: Pase sus datos como referencia para evitar el constructor de copias.

Ver más información aquí: orden de inicialización de los constructores de C ++ .


Las listas de inicialización solo se pueden usar para inicializar campos que son propiedad del tipo en cuestión. No es legal inicializar los campos de clase base en una lista de inicializadores, por lo que recibe este error. El campo es de otro modo accesible dentro de DerivedClass


No estás "accediendo" a m_data, lo estás inicializando. Sin embargo, ya se ha inicializado en el ctor de la clase base. Si desea cambiar su valor, asígnele en el cuerpo de su ctor:

DerivedClass::DerivedClass(std::string data) { m_data = data; }


No puede inicializar m_data en el constructor de la clase derivada, sino pasarlo como un argumento al constructor de la clase base.

Es decir: DerivedClass::DerivedClass(std::string data) : BaseClass(data) { }