2010-09-02 5 views
5

Je veux faire faire un membre du public dans une classe de base privée dans une classe dérivée, comme ceci:Puis-je rendre privée une variable membre publique dans une classe dérivée?

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

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

Mais apparemment « en utilisant » ne peut pas être utilisé de cette façon. Est-il possible de faire cela en C++?

(je ne peux pas utiliser l'héritage privé parce qu'il ya d'autres membres et les fonctions de A qui doit encore être public.)

+1

Cela ressemble à un design bizarre. Même si vous pouvez le faire pour la classe B, tout ce que quelqu'un doit faire est upcast à un pointeur ou une référence à A, puis ils seraient en mesure d'accéder au membre. – TheUndeadFish

+1

Copie possible de [C++: comment hériter publiquement d'une classe de base mais rendre certaines des méthodes publiques de la classe de base private dans la classe dérivée?] (Http://stackoverflow.com/questions/2986891/c-how-to -publicly-inherit-from-a-base-class-but-make-de-public-methods-fr) –

Répondre

3

Réponse courte: non. La substitution de Liskov et la nature de l'héritage public exigent que tout ce que vous pouvez faire avec un A (c'est-à-dire ses membres publics) peut également être fait par B. Cela signifie que vous ne pouvez pas masquer une méthode publique.

Si vous essayez de cacher le public fields, il n'y a pas grand chose à faire. « Cacher » les méthodes publiques, vous pourriez faire quelque chose comme:

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

Oui, en utilisant la déclaration technically vous permet de le faire.

Vous devez utiliser using A::y au lieu de using y

Cependant s'il vous plaît évaluer sérieusement si cela ce fait un sens du design.

Quelques observations:

  1. Votre classe ne doit pas avoir des données publiques. Cela devrait être évité autant que possible. Si vous respectez ce principe de conception, vous n'aurez peut-être pas besoin de le rendre privé dans une classe dérivée.

  2. S'en tenir à LSP. Si une classe de base a une méthode publique et si vous ne faites pas d'héritage privé, les clients seront désorientés si la classe dérivée rend la méthode de classe de base privée avec ces déclarations using.

Questions connexes