I. Problème▲
Considérons le code suivant :
class
Base {
public
:
virtual
void
VirtFunc();
// ...
}
;
class
Derived : public
Base {
public
:
void
VirtFunc();
// ...
}
;
void
SomeFunc( const
Base&
);
Il y a deux autres fonctions. Le but est de permettre à f1 d'utiliser un objet dérivé de façon polymorphe là où une base est attendue et d'empêcher d'autres fonctions (y compris f2) de le faire.
void
f1() {
Derived d;
SomeFunc( d ); // Ok, ça fonctionne
}
void
f2() {
Derived d;
SomeFunc( d ); // nous voulons éviter ça
}
Montrez comment obtenir cet effet.
II. Solution▲
Considérons le code suivant :
La raison pour laquelle tout code peut utiliser des objets dérivés de façon polymorphe là où une base est attendue est que les objets dérivés héritent de façon publique de la base (pas de surprise).
Si au lieu de cela, les objets dérivés héritaient de façon privée de la base, alors « quasiment » aucun code ne pourrait utiliser les objets dérivés de façon polymorphe comme bases. La raison de ce « quasiment » est qu'un code avec accès aux parties privées des objets dérivés PEUT accéder aux classes de base privées des objets dérivés de façon polymorphe en lieu et place des bases. Normalement, seules les fonctions membres des objets dérivés ont ce genre d'accès. Toutefois, nous pouvons utiliser "friend" pour étendre un accès similaire à un autre code externe.
En rassemblant les pièces du puzzle, on obtient :
Montrez comment obtenir cet effet.
La réponse consiste à écrire :
class
Derived : private
Base {
public
:
void
VirtFunc();
// ...
friend
void
f1();
}
;
Cela résout le problème proprement, bien que cela donne à f1 un plus grand accès que ce qu'avait f1 dans la version originale.
III. Remerciements▲
Cet article est une traduction en français par l'équipe de la rubrique C++ de l'article de Herb Sutter publié sur Guru of the Week. Vous pouvez retrouver cet article dans sa version originale sur le site de Guru of the Week : Controlled PolymorphismControlled Polymorphism.
Merci à gl, à mitkl et à ram-0000 pour leur relecture technique et à Torgar pour sa relecture orthographique.