¿Cuál es la lógica detrás de hiding rule en C++?C++: justificación detrás de la regla de ocultación
class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
Si se trata de una característica significativa Creo que también debería ser posible ocultar las funciones sin la definición de nuevas funciones con el mismo nombre: algo como esto:
class B : public A { hide void f(double); }
pero esto no es posible.
No creo que simplifica el trabajo compiladores, ya que los compiladores deben ser capaces de todos modos unhide funciones cuando se utiliza explícitamente el
using
Directiva:class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
Así que, ¿cómo es que no hay una regla de ocultamiento?
Hum, las tres respuestas parecen ser buenas y muestran diferentes razones para la regla de ocultación. No estoy seguro de qué respuesta debería aceptar.
Si bien la decisión no se basó en facilitar la vida de los escritores del compilador, el argumento que el compilador todavía necesita mostrar no es válido. Cuando el compilador analiza la clase con el uso, trae todos los 'A :: f' a la representación en memoria de la clase. Cuando intenta resolver una llamada, solo necesita volver tan lejos como sea necesario hasta que encuentre la primera aparición del identificador. No es necesario volver atrás, posiblemente, en varias rutas para poner todos los posibles identificadores en el alcance. Lo mismo ocurre con el hecho de que un método miembro ocultará una función de nivel de espacio de nombres ... –
AFAIK, * ocultarse sin definir nuevas funciones * es posible en C++ 11 mediante '= delete'. – Walter
Existe un mecanismo para ocultar las funciones de la clase base. Utilice 'clase A: protegido B {...};' en lugar de 'público'. Perdón por vencer a un caballo muerto. –