una referente que programacion orientada objetos miembros hijo herencia derivada clase ambito c++ c++11 clang

c++ - referente - el inicializador de miembro no nombra un miembro de datos no estáticos o una clase base



miembros de una clase en programacion orientada a objetos (1)

No, no puede inicializar los miembros de la clase base directamente desde la lista de inicializadores. Esto se debe a que el orden de inicialización procede de esta manera.

Norma C ++ n3337 § 12.6.2 / 10

En un constructor no delegante, la inicialización se realiza en el siguiente orden:

- Primero, y solo para el constructor de la clase más derivada (1.8), las clases de base virtual se inicializan en el orden en que aparecen en el primer recorrido de izquierda a derecha del gráfico acíclico dirigido de clases de base, donde "izquierda -a-derecha ”es el orden de aparición de las clases base en la lista derivada-especificador-base de la clase.

- Luego, las clases base directas se inicializan en orden de declaración tal como aparecen en la lista de especificadores de base (independientemente del orden de los inicializadores de memoria).

- Luego, los miembros de datos no estáticos se inicializan en el orden en que fueron declarados en la definición de la clase (de nuevo, independientemente del orden de los inicializadores de memoria).

- Finalmente, se ejecuta la declaración compuesta del cuerpo del constructor .

[Nota: El orden de declaración es obligatorio para garantizar que los subobjetos base y miembro se destruyan en el orden inverso de inicialización. - nota final]

Por lo tanto, puede especificar un constructor en una clase base (puede estar protegido) y usar ese en la lista de inicialización de la clase derivada ( debe ser preferido ) o puede asignar a un miembro de la clase base en el cuerpo ctor de la clase derivada Efecto y también menos eficiente: está asignando al miembro inicializado por defecto (ya tiene valor).

En el primer caso podrías escribirlo de esta manera:

struct A { float m_x; float m_z; A(){} protected: A(float x): m_x(x) {} }; class B : public A { public: B(float z) : A(z) {} // alternatively // B(float z) { // m_x = z; // } }; int main(){ B b(1); return 0; }

Esta pregunta ya tiene una respuesta aquí:

Estoy teniendo dificultades para encontrar éxitos en Google para esto.

struct a { float m_x; float m_z; public: a(float x): m_x(x) {} }; class b : public a { b(float z): m_z(z) {} };

En Clang 3.2:

error: member initializer ''m_z'' does not name a non-static data member or base class b(float z): m_z(z) {}