Maison > développement back-end > C++ > Pourquoi ne puis-je pas créer un « std :: vector » de classes abstraites ?

Pourquoi ne puis-je pas créer un « std :: vector » de classes abstraites ?

Barbara Streisand
Libérer: 2024-11-27 17:22:12
original
248 Les gens l'ont consulté

Why Can't I Create a `std::vector` of Abstract Classes?

Comprendre l'interdiction de std::vector

Dans la programmation orientée objet, les classes abstraites servent de modèles dont d'autres classes peuvent hériter. Cependant, ils ne peuvent pas être instanciés directement en raison de leur nature incomplète. Cette limitation s'étend à la déclaration d'un std::vector d'une classe abstraite, générant une erreur indiquant "ne peut pas instancier une classe abstraite".

Le problème de la classe abstraite

Les classes abstraites sont déclarées avec du virtuel pur. fonctions, qui n’ont aucune implémentation. Cela signifie qu’il ne s’agit pas d’entités concrètes pouvant être créées en tant qu’objets. Au lieu de cela, ils sont censés être hérités et leurs fonctions abstraites implémentées dans les classes enfants.

Solutions de contournement

Pour surmonter ce problème, il existe deux solutions de contournement principales :

  1. Vecteur de pointeurs vers des classes abstraites :
    Au lieu de déclarer un std::vector de classes abstraites, vous pouvez utiliser un std::vector de pointeurs vers des classes abstraites. Cela vous permet de stocker des instances de classes enfants tout en préservant le comportement polymorphe.

    std::vector<IFunnyInterface*> ifVec;
    Copier après la connexion
  2. Vecteur de classe dérivé :
    Au lieu d'utiliser une classe abstraite, vous peut créer une classe dérivée qui hérite de la classe abstraite et fournit des implémentations concrètes de toutes ses fonctions virtuelles. Vous pouvez ensuite déclarer un std::vector de cette classe dérivée.

    class FunnyDerived : public IFunnyInterface
    {
        // Implement abstract function
    };
    
    std::vector<FunnyDerived> fdVec;
    Copier après la connexion

Conclusion

Bien qu'il puisse sembler contre-intuitif de restreindre la création de std::vectors des classes abstraites, c'est un aspect fondamental de la programmation orientée objet. En adoptant l'utilisation de pointeurs vers des classes abstraites ou des classes dérivées, vous pouvez conserver la flexibilité et le polymorphisme tout en respectant les limites des classes abstraites.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal