Envoyé par
Matt_Houston
La belle affaire, c'est donc justifié lorsque :
- il n'y a pas d'héritage : MOTO ;
- le compilateur a les moyens de s'en rendre compte.
(Les choses évidentes ne sont pas forcément injustifiées )
Pas tout à fait, il y a de l'héritage (polymorphisme d'inclusion) ici :
Fonction :
void f(base_t const & b) { b.fct(); }
Utilisation :
Le souci vient uniquement lorsque l'appel du destructeur doit être virtual comme dans cet exemple :
std::unique_ptr<base_t> p = std::make_unique<derived_t>();
Et encore, pour être plus exact, il y aura un souci si derived_t ajoute des données membres qui ont un destructeur non vide (ou que ces données membres ont un destructeur non vides, etc).
J'insiste sur fait qu'il s'agit d'un choix par défaut et que je comprend qu'il ne convienne pas à tout le monde.
Cependant, j'en profite pour rajouter que, à titre personnel, je n'ai jamais eu besoin d'utiliser le polymorphisme d'inclusion
et que la programmation générique m'a suffit jusqu'à présent.
Partager