No, realmente no veo el problema.
En lugar de using
, que podría haber hecho esto:
class X
{
protected:
void protectedFunction() { cout << "i am protected" ; }
};
class Y : public X
{
public:
void protectedFunction() { X::protectedFunction(); }
};
Cualquier clase puede tomar cualquier miembro que es visible a ella, y decide exponerlo públicamente. Puede ser un mal diseño de clase para hacerlo, pero ciertamente no es un defecto en el lenguaje. Todo el punto en los miembros privados o protegidos es que la clase misma debe decidir quién debe tener acceso al miembro. Y si la clase decide "Voy a dar acceso a todo el mundo", entonces así es como está diseñada la clase.
Si seguimos su lógica, entonces getter y setters violan la encapsulación también. Y a veces lo hacen. Pero no porque el lenguaje esté roto. Simplemente porque estás eligiendo diseñar clases rotas.
Al hacer que un miembro sea protegido, le da a las clases derivadas la libertad de hacer haciendo que les guste con el miembro. Pueden verlo, para poder modificarlo o exponerlo públicamente. Eligió hacer esto posible cuando hizo que el miembro estuviera protegido. Si no quieres eso, deberías haberlo hecho en privado.
para aclarar: el objetivo de mi pregunta no era hablar sobre formas brutales o engañosas de romper la encapsulación. Sólo quería discutir las decisiones de diseño u otras características de C++ que podrían haber conducido a esta característica. ¿Es solo un efecto secundario de la solución para funcionar el problema de ocultación o es una característica independiente que se introdujo en C++ por alguna razón específica –
Creo que la razón por la que las personas enumeran todas estas formas de romper la encapsulación no es documentar cómo hazlo, pero para explicar que tienes que elegir romper la encapsulación. Cuando hay un error porque intentó acceder a un método o miembro privado, eso podría servir como un recordatorio suave, y si respeta los deseos del diseñador, lo llevará a diseñar una solución cooperativa. Siempre es un hecho que la encapsulación se puede romper a la fuerza. La encapsulación 'protected' no se puede romper sin fuerza, lo cual no creo que sea una falla en parte del lenguaje. –