Maison >développement back-end >C++ >Pourquoi ne puis-je pas transmettre un « conteneur » à un constructeur attendant un « conteneur » ?

Pourquoi ne puis-je pas transmettre un « conteneur » à un constructeur attendant un « conteneur » ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 08:23:27341parcourir

Why Can't I Pass a `Container` to a Constructor Expecting `Container`?

Polymorphisme des modèles : quand les modèles ne fonctionnent pas bien

En C, les modèles fournissent un mécanisme puissant pour la programmation générique. Cependant, leur comportement polymorphe présente des limites. Cet article répond à une question concernant l'absence de polymorphisme de modèle dans un scénario spécifique.

La requête

Un utilisateur rencontre une erreur « aucune fonction de correspondance » lors de l'appel d'un constructeur. qui prend un paramètre de type Container&. Le constructeur est défini dans la classe Bar et l'utilisateur crée une instance de Container.

Explorer le polymorphisme

Le polymorphisme permet aux objets de différentes classes d'être traités comme des objets d’une classe de base commune. Cependant, ce comportement ne s'étend pas aux modèles en C . Bien qu'il dérive de l'interface, Foo ne fait pas automatiquement en sorte que Container un argument valable pour un constructeur qui attend Container.

La non-covariance des modèles

L'aspect clé ici est le manque de covariance des modèles. Dans les modèles covariants, un type dérivé est automatiquement considéré comme un argument valide pour un modèle qui attend son type de base. Cependant, en C , les modèles ne sont pas covariants.

Conséquences de la covariance

Considérez l'exemple suivant :

class Fruit {...};
class Apple : public Fruit {...};
class Orange : public Fruit {...};
std::vector<Apple>& apple_vec; // Vector of apples
std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed
fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!

Comme le souligne l'explication , le traitement covariant des modèles peut conduire à des situations dans lesquelles des types qui devraient être incompatibles sont traités comme compatibles, brisant ainsi la sécurité des types.

Solutions alternatives

Étant donné que les modèles covariants ne sont pas pris en charge dans C , des solutions alternatives doivent être employées. Des assertions statiques ou des caractères génériques limités (disponibles en Java) peuvent être utilisés pour appliquer les relations de type requises. Dans le scénario spécifique mentionné dans la requête, une simple assertion statique peut vérifier que le type de conteneur transmis est bien un conteneur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn