Bonjour,
Que pensez-vous de l'idée d'un héritage constant en C++ ?
class Cercle : public const EllipseAbstraite { /*...*/ };
Caractéristiques :
- Cercle& est convertible en const EllipseAbstraite&, mais pas en EllipseAbstraite&.
- Si EllipseAbstraite a des fonctions virtuelles pures alors, pour que Cercle soit instanciable, il doit implémenter les fonctions virtuelles pures constantes de EllipseAbstraite.
- Si on appelle une fonction non constante de EllipseAbstraite via une instance de Cercle (à cause d'un const_cast), le comportement est indéterminé.
1 2 3 4 5
| Cercle cercle;
const EllipseAbstraite& ellipse = cercle;;
EllipseAbstraite& danger = const_cast<EllipseAbstraite&>(ellipse);
danger.fonctionNonConstante(); // aïe
danger.fonctionVirtuellePureNonConstante(); // crash |
- Le code suivant est autorisé :
1 2
| class Deriv : virtual public const Base { /*...*/ };
class Deriv2 : public Deriv, virtual public Base { /*...*/ }; // pas de const |
- Pour la cohérence, on aurait aussi l'héritage volatile et l'héritage constant volatile, qui ne serviraient à rien.
Le principal intérêt serait de réduire la quantité de classes en évitant les doublons Base/ConstBase :
1 2
| class EllipseAbstraite : public ConstEllipseAbstraite { /*...*/ };
class Cercle : public ConstEllipseAbstraite { /*...*/ }; |
Partager