Guru Of the Week n° 40 : polymorphisme contrôlé

| Herb Sutter | Traduction par l'équipe de la rubrique C++ |

Difficulté : 8 / 10
Le polymorphisme EST-UN est un outil très utile en conception orienté objet (OO modeling), mais parfois vous pouvez vouloir restreindre les codes qui peuvent utiliser certaines classes de façon polymorphe. Ce programme donne un exemple et montre comment obtenir l'effet désiré.

Retrouvez l'ensemble des Guru of the Week sur la page d'index.

N'hésitez pas à commenter cet article ! Commentez

- Titre : Guru Of the Week n° 40 : polymorphisme contrôlé

- Auteurs : Herb Sutter, Traduction par l'équipe de la rubrique C++

- Parution : 13 septembre 2012

- Licence : Copyright ® 2009 Herb Sutter. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Problème

- II. Solution

- III. Remerciements

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 Polymorphism.

Merci à gl, à mitkl et à ram-0000 pour leur relecture technique et à Torgar pour sa relecture orthographique.