Supongamos que tiene una clase que define métodos virtuales con el especificador de acceso público. ¿Se puede cambiar el especificador de acceso en sus métodos modificados? Supongo que no. Buscando una explicación.Especificador de acceso al anular métodos
Respuesta
Sí, puede, pero "no hace grok".
Tome un vistazo a Overriding public virtual functions with private functions in C++
definitivamente se puede. Pero no tiene sentido. Si es una herencia pública, entonces siempre puedes lanzar un objeto a su base. Si se trata de una herencia privada, todos los métodos básicos ya son privados por defecto. En el caso de la herencia protegida, puede hacer que el método base sea privado, por lo que evita que las posibles clases derivadas lo llamen, pero realmente no entiendo por qué uno podría necesitarlo.
Sí, puede, y de hecho ni siquiera necesita anular o usar nada virtual.
class ABC {
public: // or this may be protected, no difference
void woof();
void moo();
};
class D : private ABC { // now woof and moo are private
public:
using ABC::woof; // using declaration to make woof public again
ABC::moo; // access declaration (deprecated) does the same
};
Lo mismo funciona si son virtuales, también. O, como señalaron otros, la búsqueda de funciones virtuales ignora el acceso especificado por la clase implementadora; cualquier clase a la que pueda enviarle puede proporcionar acceso en tiempo de compilación.
Por otro lado, sin las declaraciones especiales en D
, la interfaz de public
ABC
de hecho sería inaccesible a través D
porque no sería capaz de upcast a ABC
. Y si woof
y moo
fueron virtual
, le conviene hacer las anulaciones private
para ocultarlas. Tal vez eso mejor responde la pregunta.
Estoy bastante seguro de que hace una gran diferencia si fueran 'privados' en' clase ABC'. 'clase D' tiene que tener acceso a los miembros base antes de que pueda nombrarlos con éxito en una declaración' using'. OTOH, podrían haber sido 'protegidos' en' ABC' y el uso seguiría funcionando. –
@Ben: lo siento, quise decir protegido. Fijo. – Potatoswatter
La respuesta es: tipo de. Solo puede cambiar el acceso de los miembros a los que tiene acceso la clase derivada. El tipo de herencia no tiene efecto: esto solo controla el acceso predeterminado para los miembros heredados (hasta cierto punto, siguiendo otras reglas).
Por lo tanto, puede hacer que los miembros protegidos de una clase base sean públicos o privados; o los miembros públicos de una base protegidos o privados. Sin embargo, no puede hacer que los miembros privados de una base sean públicos o protegidos.
Ejemplo:
class Foo
{
protected:
void protected_member();
private:
void private_member();
public:
void public_member();
};
class Bar : private Foo
{
public:
using Foo::protected_member;
using Foo::private_member;
using Foo::public_member;
};
int main(int, const char**)
{
Bar bar;
return 0;
}
El código anterior provoca el siguiente error en g ++ 4.1.2:
MAIN.C: 7: error: 'vacío Foo :: private_member()' es privado
mAIN.C: 14: error: dentro de este contexto
Además, primordial no tiene nada que ver con cambiar el acceso de un método. Puede anular un método privado virtual, simplemente no puede llamarlo desde una clase derivada.
- 1. Clase C++ especificador de acceso Verbosidad
- 2. Diferencia entre especificador de acceso y modificador de acceso
- 3. modificadores de acceso java y métodos de anulación
- 4. Problema al anular malloc
- 5. Error al anular anotaciones en Eclipse
- 6. ¿Cómo anular los métodos anidados de objetos C++?
- 7. ¿Se pueden anular los métodos de categoría? IOS
- 8. especificador de formato C
- 9. ¿Puedo anular los métodos de Ruby escritos en C?
- 10. ¿Es realmente necesario anular objetos en métodos de desmontaje JUnit?
- 11. SUDS - acceso programático a métodos y tipos
- 12. ¿Es mejor utilizar los métodos getter o acceder a los campos privados directamente al anular toString?
- 13. Diferencias al anular campos de constructor heredados?
- 14. Acceso al contenedor DI
- 15. anidada-nombre-especificador
- 16. C "% d" especificador de formato
- 17. Validación @ScriptAssert con acceso a métodos estáticos
- 18. Cuál es la diferencia entre el especificador de acceso protegido y el interno protegido en C#
- 19. acceso clase interna al método de la clase externa, mismos nombres de los métodos
- 20. especificador-calificador lista de espera antes de
- 21. sendgrid anular la suscripción al formato
- 22. ¿Acelerar el acceso al sistema de archivos?
- 23. Anular la suscripción programáticamente al evento
- 24. fondo negro al anular drawRect en UIScrollView
- 25. Restringir el acceso al proveedor de contenido
- 26. Alternativas al acceso
- 27. No use métodos de acceso en métodos de inicializador y dealloc
- 28. Acceso al cierre modificado
- 29. ¿Es una buena práctica usar siempre métodos de acceso, incluso cuando se accede al estado local?
- 30. Especificador de formato de flotante a cadena
Pero, como dice la pregunta frecuente de parashift.com, eso no se aplica a la herencia privada/protegida. – Potatoswatter