c++ - poo - No se permite el uso de objetos base en herencia privada.
herencia simple (2)
Estoy usando herencia privada , y me sorprende ver que en la clase derivada no está permitido el uso de ningún objeto base .
class A;
class B : private A;
class C : public B;
C::method_1()
{
A* a; // Temporary "A" object for local computation
}
Esto no tiene nada que ver con la herencia. ¡No quiero acceder a ningún this->base method
!
Esta configuración proporciona un error C2247 en Visual Studio (no se puede acceder a "A" porque "B" usa "privado" para heredar de "A").
Cambia esto:
A* a;
a esto:
::A* a;
ya que C
hereda de B
y B
de A
, entonces necesita el operador de resolución de alcance para hacer el truco.
En lugar de comenzar en el ámbito local que incluye a los padres de clase, ::A
comienza a analizar el ámbito global debido a ::
.
De la Standard :
11.1.5 Especificadores de acceso
En una clase derivada, la búsqueda de un nombre de clase base encontrará el nombre de clase inyectada en lugar del nombre de la clase base en el ámbito en el que se declaró. El nombre de la clase inyectada puede ser menos accesible que el nombre de la clase base en el ámbito en el que se declaró.
ISO C ++: 11.1 Especificadores de acceso
5 [Nota: en una clase derivada, la búsqueda de un nombre de clase base encontrará el nombre de clase inyectada en lugar del nombre de la clase base en el ámbito en el que se declaró. El nombre de la clase inyectada podría ser menos accesible que el nombre de la clase base en el ámbito en el que se declaró. "Nota final"
Y el ejemplo de la norma:
class A { };
class B : private A { };
class C : public B {
A* p; // error: injected-class-name A is inaccessible
::A* q; // OK
};
Borrador de Trabajo N3797, Estándar para el Lenguaje de Programación C ++