tag sobre sabes preguntas para papa padres novio mis hijos hijo hacerle entrevista cuanto conozco c++ inheritance constructor initialization-list

sobre - Inicializar los miembros protegidos del padre con la lista de inicialización(C++)



tag del novio (4)

Cuando el compilador encuentra la lista de inicializadores, el objeto de clase derivado aún no se ha formado. El constructor de la clase base no ha sido llamado hasta entonces. Solo después de que se ha llamado al constructor de la clase base, something convierte en realidad. De ahí el problema. Cuando no llama explícitamente al constructor de la clase base, el compilador hace eso por usted (generando el constructor trivial apropiado para la clase base). Esto hace que something miembro sea inicializado por defecto.

Del borrador de C ++ 0x:

12.6.2 Inicializando bases y miembros

2 Los nombres en un identificador-inicializador-identificador se buscan en el alcance de la clase del constructor y, si no se encuentran en ese alcance, se buscan en el ámbito que contiene la definición del constructor. [Nota: si la clase del constructor contiene un miembro con el mismo nombre que una clase base directa o virtual de la clase, un mem-initializer-id que nombra el miembro o clase base y está compuesto por un único identificador se refiere al miembro de la clase. Se puede especificar un ID de meminitizador para la clase base oculta utilizando un nombre calificado. -finalizar nota] A menos que la mem-initializer-id nombre la clase del constructor, un miembro de datos no estático de la clase del constructor o una base directa o virtual de esa clase, el mem-initializer está mal formado.

Nota: Énfasis mío.

¿Es posible usar la lista de inicialización de un constructor de clase hijo para inicializar los miembros de datos declarados como protegidos en la clase padre? No puedo conseguir que funcione. Puedo evitarlo, pero estaría bien si no tuviera que hacerlo.

Algunos ejemplos de código:

class Parent { protected: std::string something; }; class Child : public Parent { private: Child() : something("Hello, World!") { } };

Cuando intento esto, el compilador me dice: "class ''Child'' no tiene ningún campo llamado ''algo''". Es algo como esto posible? Si es así, ¿cuál es la sintaxis?

¡Muchas gracias!


No puede inicializar miembros de la clase principal en la lista de inicialización del constructor de clases derivadas. No importa si están protegidos, públicos o cualquier otra cosa.

En su ejemplo, member something es miembro de la clase Parent , lo que significa que solo se puede inicializar en la lista de inicializadores del constructor de la clase Parent .


No es posible en la forma en que describes. Deberá agregar un constructor (podría estar protegido) a la clase base para reenviarlo. Algo como:

class Parent { protected: Parent( const std::string& something ) : something( something ) {} std::string something; } class Child : public Parent { private: Child() : Parent("Hello, World!") { } }


Tal vez puedas intentarlo de esa manera usando la palabra clave "usar"

class Parent { protected: std::string something; }; class Child : public Parent { private: using Parent::something; Child() { something="Hello, World!"; } };