Mot clé final

Le mot clé contextuel (et optionnel) final permet d'empêcher la spécialisation d'une classe ou d'une méthode polymorphique.

Classe dont on ne peut dériver Méthode qu'on ne peut spécialiser
class HauteurInvalide{};

class Carre final {
public:
   using size_type = unsigned short;
private:
   size_type hauteur_;
   static size_type valider(size_type hauteur) {
      if (hauteur == 0) throw HauteurInvalide{};
      return hauteur;
   }
public:
   Carre(size_type hauteur)
      : hauteur_{valider(hauteur)}
   {
   }
   size_type hauteur() const noexcept {
      return hauteur_;
   }
   // etc.
};
struct Dessinable {
   virtual void dessiner(std::ostream &) const = 0;
   virtual ~Dessinable() = default;
};
//
// Ici, Forme implémente de manière tardive l'idiome NVI
// et ne veut pas que les enfants spécialisent dessiner()
// qui lui sert de point d'ancrage
//
class Forme : public Dessinable {
public:
   void dessiner(std::ostream &os) const final { // <-- ICI
      // valider des préconditions
      dessinerImpl(os);
      // valider des postconditions
   }
protected:
   virtual void dessinerImpl(std::ostream &) const = 0;
};

Marquer une classe ou une méthode comme terminale (final) permet certaines optimisations, mais permet surtout de porter clairement l'intention de la programmeuse ou du programmeur lorsqu'une classe ou une méthode n'a pas été pensée pour être spécialisée.

Lectures complémentaires

Quelques liens pour enrichir le propos.


Valid XHTML 1.0 Transitional

CSS Valide !