2011-01-05 27 views
6

Dado que hemos sobrecargado métodos de la clase base, y una clase derivada que se hereda como privado/protegido.Declaración de Acceso Base Clase Método sobrecargado

  1. ¿Podemos restaurar solo uno/varios del nivel de acceso original de los métodos sobrecargados?
  2. En GCC 4.4.0 Trato de poner los métodos de base bajo acceso protegido, a continuación, heredó el uso de acceso privado. Cuando trato de restaurar el nivel de acceso a público, ¡funciona! ¿Es así como se supone que debe funcionar? o es un error en el compilador? A mi entender, la restauración del nivel de acceso no debería poder usarse para promover o degradar el nivel de acceso de un miembro.

Código fragmento:

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

Por cierto, es una declaración como 'base :: method' exactamente equivalente a' usando la base :: method'? – Kos

+0

@Kos, sí, pero ya no es válido decir 'base :: method;' en C++ 0x. Fue eliminado por el borrador n3225. –

Respuesta

4

Cambio de accesibilidad de las funciones heredadas a través de una declaración using no se puede hacer de forma selectiva en la sobrecarga dada por la sencilla razón de que una declaración using sólo introduce un nombre en la región declarativa y que, por definición, funciones sobrecargas comparten el mismo nombre.

La única alternativa que veo aquí es el uso de las funciones de redirección triviales:

class derived : private base 
{ 
public: 
    void method() { base::method(); } 

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

No estoy muy seguro de entender su segunda pregunta, pero eso sí: se puede cambiar la accesibilidad miembros de base en una clase derivada a través using declaraciones.

+0

perfecto, gracias .. combinar esto con la respuesta @DeadMG para la segunda pregunta y nosotros puede marcar la pregunta resuelta ... –

1

Usted no restaurar el acceso, per se. Usted establece acceso. Como está haciendo arriba, puede establecer explícitamente el acceso para cualquier método, incluidos los previamente declarados como private.

1

Sería imposible evitar métodos protegidos de ser pública si la clase derivada lo quería así, ya que sólo podría escribir un envoltorio menor y hecho. private es otro asunto.

+0

akh ... sí ... eso tiene sentido ... gracias ... Estaba leyendo un capítulo de "C++ Complete References 4th Ed.", Y hay un párrafo que dice: "Puede usar una declaración de acceso para restaurar los derechos de acceso de públicos y protegidos miembros. sin embargo, no se puede usar una declaración de acceso para subir o bajar el estado el acceso de un miembro. por ejemplo, un miembro declara como privado en una clase base no puede ser hecho público por una clase derivada. (Si C++ permitidos que esto ocurra, destruiría su mecanismo de encapsulación !)" .. Así que creo que quería decir al público y protegido para ser considerado al mismo nivel .. –

Cuestiones relacionadas