2011-03-09 22 views
7

Esta es una pregunta de la entrevista. No soy experto en C++ sin embargo, así que necesito un poco de ayuda en la búsqueda de la respuesta a esta pregunta (i primero quiero entender la pregunta ... ¿es una pregunta válida?)C++: ¿restringir el acceso a los métodos de la superclase selectivamente?

Pregunta:

Suponga Tengo una clase B que deriva de la clase A y quería reutilizar algunos, pero no todos los métodos de A. ¿Cómo restringiría el acceso a los métodos de la superclase de forma selectiva?

gracias!

+0

Probablemente quiera decir que * quiere reutilizar algunos ... de los métodos de ** A ***. –

+0

sí ... He hecho la corrección ... gracias .. – maxpayne

Respuesta

10

que asumen que

  1. no se puede cambiar la definición de A
  2. desea seleccionar qué métodos de A deben ser accesibles desde un objeto B.

La directiva using resuelve su problema. Ejemplo:

class A 
{ 
public: // or protected for that matter 
    void foo(); 
    void bar(); 
}; 

class B : private A // or protected, depending on whether 
        // you want subclasses of B to expose 
        // some methods from A themselves 
{ 
public: 
    using A::foo; 
}; 

hace foo utilizable a partir de la clase B, pero no bar. Pero como advertencia, tenga en cuenta que using A::foo expondrá todas las sobrecargas de foo.

+1

Esta es una buena solución, cumpliendo con la pregunta. Sin embargo, debe tenerse en cuenta que la clase B está completamente separada de la jerarquía de herencia, por lo que no es posible hacer algo como "B objB; A * ptrA = &objB;". AFAIK, no hay una solución completamente satisfactoria para esta pregunta. – Baltasarq

+0

@Baltasarq: ¿cuál es el objetivo de restringir los métodos de 'A' si puede acceder a ellos a través de un puntero desnudo a' A'? Recuerde que la herencia privada es ** no ** una "es una" relación. Está solo remotamente relacionado con la herencia pública "normal", y debe verse como un dispositivo de composición. –

+0

¿Puedes explicar "Pero como advertencia, ten en cuenta que usar A :: foo expondrá todas las sobrecargas de foo"? – maxpayne

3

La respuesta que probablemente quieran escuchar es que puede poner los métodos para reutilizar en la sección protected de la clase base, los métodos que no deberían ser visibles para las clases derivadas deberían ir a la sección private.

Sin embargo, dando un paso atrás, es posible que pueda obtener puntos adicionales señalando que podría haber mejores medidas para reutilizar el código, dependiendo de lo que hagan las funciones (como el uso de funciones gratuitas que no son visibles en un archivo de cabecera).

+0

¿Cuáles son las funciones gratuitas? – maxpayne

+0

@maxpayne: funciones planas de vainilla, es decir. funciones que no son funciones miembro ("métodos") –

+0

mientras que su solución es realmente simple y limpia ... creo que no se mantendrá si no se permite cambiar el código en la clase A ... – maxpayne

Cuestiones relacionadas