2010-09-02 18 views
5

quiero hacer que un miembro del público en una clase base privada en una clase derivada, como esto:¿Puedo hacer que una variable de miembro público sea privada en una clase derivada?

class A { 
public: 
    int x; 
    int y; 
}; 

class B : public A { 
    // x is still public 
private: 
    // y is now private 
    using y; 
}; 

Pero al parecer el "uso" no se pueden utilizar de esa manera. ¿Hay alguna manera de hacer esto en C++?

(No puedo usar la herencia privada porque hay otros miembros y funciones de A que todavía debe ser pública.)

+1

Esto se siente como un diseño incómodo. Incluso si puede hacer esto para la clase B, todo lo que alguien debería hacer es actualizar a un puntero o referencia a A y luego podrían acceder al miembro. – TheUndeadFish

+1

Posible duplicado de [C++: cómo heredar públicamente de una clase base pero hacer que algunos de los métodos públicos de la clase base sean privados en la clase derivada?] (Http://stackoverflow.com/questions/2986891/c-how-to -publicly-inherit-from-a-base-class-but-make-some-of-public-methods-fr) –

Respuesta

3

Respuesta corta: no. La sustitución de Liskov y la naturaleza de la herencia pública exige que todo lo que se puede hacer con un A (es decir, sus miembros públicos) también se puede hacer por B. Eso significa que no puedes ocultar un método público.

Si está tratando de ocultar public fields, no hay mucho que pueda hacer. "Ocultar" los métodos públicos, se podría hacer algo como:

class B { 
    // x is still public 
    int x() { return a.x(); } 
private: 
    A a; 
    // y is now private since you didn't add a forwarding method for it 
}; 
3

Sí, mediante declaración technically permite que lo haga.

usted tiene que utilizar en lugar de using A::yusing y

Sin embargo, tenga evaluar seriamente si haciendo esto tiene un sentido de diseño.

Pocas observaciones:

  1. Su clase no debe tener los datos públicos. Eso debe evitarse tanto como sea posible. Si te apegas a este principio de diseño, es posible que no tengas la necesidad de hacerlo privado en la clase derivada.

  2. Se adhieren a LSP. Si una clase base tiene un método público, y a menos que esté haciendo una herencia privada, los clientes se confundirán si la clase derivada hace que el método de la clase base sea privado con dichas declaraciones.

Cuestiones relacionadas