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; };
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;
Ce code entraînera l'erreur de compilation suivante :
error C2259: 'IFunnyInterface' : cannot instantiate abstract class
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"); } };
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;
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!