Maison > développement back-end > C++ > Pouvez-vous créer un vecteur de classes abstraites en C ?

Pouvez-vous créer un vecteur de classes abstraites en C ?

Mary-Kate Olsen
Libérer: 2024-12-02 07:41:14
original
420 Les gens l'ont consulté

Can You Create a Vector of Abstract Classes in C  ?

Vecteur de classes abstraites en C : une introduction

En C, les classes abstraites fournissent un moyen de définir des interfaces sans implémentation, permettant des classes dérivées pour hériter et mettre en œuvre des comportements spécifiques. Cependant, contrairement à C#, où les interfaces peuvent être instanciées directement, les classes abstraites en C ne peuvent pas l'être.

Le problème

Considérez l'exemple C suivant :

class IFunnyInterface
{
public:
    virtual void IamFunny() = 0;
};
Copier après la connexion

Cette classe abstraite représente une interface avec une seule méthode, IamFunny. Maintenant, disons que nous voulons créer un vecteur d'objets qui implémentent cette interface, tels que :

std::vector<IFunnyInterface> funnyItems;
Copier après la connexion

Ce code entraînera l'erreur de compilation suivante :

error C2259: 'IFunnyInterface' : cannot instantiate abstract class
Copier après la connexion

Cette erreur se produit parce que C n'autorise pas l'instanciation de classes abstraites.

Une solution de contournement

Une La solution de contournement consiste à remplacer la classe abstraite par une classe concrète qui lève une exception lors de la tentative d'appel d'une méthode non implémentée :

class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};
Copier après la connexion

Bien que cette solution de contournement permette l'instanciation vectorielle, elle introduit un piège potentiel : un code qui tente de accéder aux méthodes d'un objet IFunnyInterface devra gérer l'exception.

Une alternative Solution

Une solution plus élégante consiste à utiliser un vecteur de pointeurs vers des classes abstraites :

std::vector<IFunnyInterface*> ifVec;
Copier après la connexion

Cette approche permet un comportement polymorphe et évite le problème de découpage d'objet qui peut survenir avec stockage de valeurs directes.

En comprenant les limites de l'instanciation de classe abstraite en C, vous pouvez utiliser des solutions de contournement appropriées ou utiliser des alternatives pour obtenir la fonctionnalité souhaitée dans votre code.

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