program online ejemplos descargar caracteristicas c++

c++ - online - La herencia privada oculta la clase base con el error "inaccesible dentro de este contexto"



c++ program (2)

Buena pregunta, no puedo encontrar una manera de hacer eso. La única opción que veo es introducir typedef fuera de Z:

typedef X PITA; class Z : public Y { public: PITA x; // ok };

Tengo un problema similar al descrito en el siguiente enlace donde una clase base heredada de forma privada da un error "inaccesible dentro de este contexto" cuando intento declarar un miembro de la clase base dentro de la clase derivada: http://bytes.com/topic/c/answers/164246-private-inheritance-renders-class-inaccessible

La referencia explícita a X con :: X funciona en el caso anterior, pero ¿qué sucede si el código está en una función como:

void fooby() { class X {}; class Y : private X {}; class Z : public Y { public: X x; // compiler "inaccessible within this context" error }; };

¿Cómo hace referencia a X en este caso?

Si fooby fuera una estructura / clase, entonces :: fooby :: X funcionaría, pero no estoy seguro de cómo hacerlo en el caso anterior.


El problema al que se enfrenta es que hay un identificador inyectado X en Y (y todos los tipos derivados) que se refiere a X , que no es accesible debajo de Y.

En el caso común de los tipos definidos por el usuario que se declaran a nivel de espacio de nombres, puede usar el espacio de nombres para calificar el tipo y obtener acceso:

class X {}; class Y : X {}; class Z : Y { ::X x; // or Namespace::X };

Porque está definiendo sus tipos dentro de una función que no es una opción válida.

Alternativamente, puede solucionar el problema con otras soluciones. Como propuso @Eugene, puede crear un identificador alternativo para referirse a X :

typedef class X {} another_name; class Y : X {}; class Z : Y { another_name x; };

O puede agregar un typedef dentro de Y para proporcionar el tipo a los tipos derivados:

class X {}; class Y : X { public: typedef X X; }; class Z : Y { X x; };

Esta última opción funciona porque agregará un identificador X dentro de Y que es public y se refiere al tipo, por lo que el compilador encontrará el tipo allí y lo usará en Z