2013-04-02 3 views
3

Je sais comment fonctionne ce spécificateur.Utilisation pratique du spécificateur 'protected' en C++

Je suis intéressé par l'utilisation pratique de ce genre de choses dans la programmation réelle. Je ne peux imaginer aucun exemple où les membres de la classe protégée sont vraiment nécessaires (je veux dire quand nous ne pouvons pas remplacer «protégé» par «privé»).

+0

Vous pouvez être mal à votre question en demandant quand il est vraiment nécessaire * *. L'ensemble du langage C++ n'est pas * vraiment nécessaire *. Demandez-vous quand c'est utile? –

+0

Je pense que je prendrais du recul. Quand/si vous utilisez l'héritage, l'utilisation de protected semble assez évidente (du moins pour moi). OMI, la vraie question est: "Quelles sont les utilisations pratiques de l'héritage en C++?" –

+0

@JerryCoffin si c'est vraiment évident, où et quand ne puis-je remplacer «protégé» par «privé» ou «public»? (dépend d'une situation) – mechanic

Répondre

12

Une classe a deux API - une pour le code qui l'instancie et utilise les objets résultants, et une pour les sous-classes. La première API est constituée des membres public, tandis que la seconde est composée des membres public et protected. Il y a des opérations et des données qui permettent à une sous-classe d'accéder au fait que les utilisateurs ordinaires n'y ont pas accès. En guise d'exemple concret, imaginez une bibliothèque de classes Windows GUI. Il enveloppe et cache l'ancienne API Windows. Un Window représente une fenêtre et possède un HWND qui est le handle de fenêtre Windows sous-jacent. Il cache le HWND aux utilisateurs de la classe Window, car ce n'est pas leur affaire (ou s'il est correct pour eux de l'utiliser, il l'expose uniquement via un accesseur en lecture seule). Mais il est bon pour les sous-classes de Window, comme FrameWindow ou EditControl, pour accéder au HWND directement:

class Window 
{ 
public: 
    void Show(); // Example public API 

protected: 
    HWND m_hwnd; 
}; 
+0

J'aime le terme "deux API". Tout ceci est particulièrement vrai dans la conception d'un cadre réutilisable. –

+4

@SimonWhitehead: Il existe en fait * trois * API: le public pour les clients, le protégé où vous offrez des services à vos types dérivés et le virtuel par lequel votre base obtient des services à partir des types dérivés. Vous pouvez google pour NVI (NonVirtual Interface) qui explique comment concevoir pour les interfaces publiques et virtuelles +1 –

+0

Dernièrement, j'ai vu une préférence pour la définition de méthodes non publiques, virtuelles et autres, comme protégées, mais toujours forçant les données les membres doivent être privés. Généralement, je trouve cela utilisable, et utile lors de la conception de la hiérarchie des classes; mais il est parfois plus logique que les données soient protégées - par exemple, si la donnée est un foncteur. –

Questions connexes