Bonjour,

Que pensez-vous de l'idée d'un héritage constant en C++ ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
class EllipseAbstraite : public ConstEllipseAbstraite { /*...*/ };
class Cercle           : public ConstEllipseAbstraite { /*...*/ };