Quand utiliser template vs inheritance

Je suis à la recherche de celui-ci, et la réponse commune à cela semble aller dans le sens de “ils ne sont pas liés, et l’un ne peut se substituer à l’autre”. Mais dites que vous êtes en entrevue et qu’on vous le demande “Quand utiliseriez-vous un modèle au lieu d’un inheritance et vice versa?”

Selon moi, les modèles et l’inheritance sont littéralement des concepts orthogonaux: l’inheritance est “vertical” et descend, de l’abstrait au plus concret. Une forme, un sortingangle, un sortingangle équilatéral.

Les modèles, en revanche, sont “horizontaux” et définissent des instances de code parallèles qui ne se connaissent pas. Le sorting des entiers est formellement identique au sorting des doublons et des chaînes de sorting, mais ce sont trois fonctions entièrement différentes. Ils se ressemblent tous de loin, mais ils n’ont rien à faire l’un avec l’autre.

L’inheritance fournit une abstraction à l’exécution. Les modèles sont des outils de génération de code .

Les concepts étant orthogonaux, ils peuvent être utilisés avec bonheur pour atteindre un objective commun. Mon exemple préféré est l’ effacement du type , dans lequel le conteneur d’effacement du type contient un pointeur de base virtuel vers une classe d’implémentation, mais il existe arbitrairement de nombreuses implémentations concrètes générées par une classe dérivée de modèle. La génération de code de modèle sert à remplir une hiérarchie d’inheritance. La magie.

La “réponse commune” est fausse. Dans “Effective C ++”, Scott Meyers déclare à la rubrique 41:

Point 41: Comprendre les interfaces implicites et le polymorphism au moment de la compilation.

Meyers poursuit en résumant:

  • Les classes et les modèles prennent en charge les interfaces et le polymorphism.
  • Pour les classes, les interfaces sont explicites et centrées sur les signatures de fonction. Le polymorphism se produit au moment de l’exécution via des fonctions virtuelles.
  • Pour les parameters de modèle, les interfaces sont implicites et basées sur des expressions valides. Le polymorphism se produit lors de la compilation via l’instanciation du modèle et la résolution de la surcharge des fonctions.

utilisez un modèle dans une base (ou une composition) lorsque vous souhaitez conserver la sécurité du type ou éviter l’envoi virtuel.

Les modèles sont appropriés lors de la définition d’une interface qui fonctionne sur plusieurs types d’objects non liés. Les modèles conviennent parfaitement aux classes de conteneur où il est nécessaire de généraliser les objects du conteneur tout en conservant les informations de type.

En cas d’inheritance, tous les parameters doivent être du type de paramètre défini ou en être étendu. Ainsi, lorsque les méthodes fonctionnent sur des objects qui ont correctement une relation hiérarchique directe, l’inheritance est le meilleur choix.

Lorsque l’inheritance est appliqué de manière incorrecte , il est nécessaire de créer des hiérarchies de classes trop complexes, composées d’objects non liés. La complexité du code augmentera pour un petit gain. Si tel est le cas, utilisez des modèles.

Le modèle décrit un algorithme tel que décider du résultat d’une comparaison entre les deux objects d’une classe ou de les sortinger. Le type (classe) d’objects utilisés varie, mais l’opération, la logique, l’étape, etc. sont logiquement les mêmes.

Par ailleurs, l’inheritance n’est utilisé par la classe enfant que pour étendre ou rendre plus spécifique la fonctionnalité parents. J’espère que ça a du sens