839 votes

Comment vous déclarer une interface en C++ ?

Comment puis-je configurer une classe qui représente une interface ? Est-ce juste une classe de base abstraite ?

716voto

Mark Ransom Points 132545

Pour étoffer la réponse par bradtgmurray, vous pouvez faire une exception à la méthode virtuelle pure liste de votre interface en ajoutant un destructeur virtuel. Cela vous permet de passer le pointeur de la propriété à une autre partie sans exposer le béton de la classe dérivée. Le destructeur n'a pas à faire quoi que ce soit, parce que l'interface n'ont pas de structures en béton. Il peut sembler contradictoire de définir une fonction à la fois virtuel et en ligne, mais croyez-moi - il n'est pas.

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

class Parent
{
    public:
        virtual ~Parent();
};

class Child : public Parent, public IDemo
{
    public:
        virtual void OverrideMe()
        {
            //do stuff
        }
};

Vous n'avez pas à inclure un corps pour le destructeur virtuel -, il s'avère que certains compilateurs ont de la difficulté de l'optimisation d'un vide destructeur et il est préférable d'utiliser la valeur par défaut. http://connect.microsoft.com/VisualStudio/feedback/details/560640/empty-c-destructors-prevent-optimization

252voto

bradtgmurray Points 3999

Définissez une classe avec des méthodes virtuelles pures. Utilisez l’interface en créant une autre classe qui substitue les méthodes virtuelles.

Une méthode virtuelle pure est une méthode de classe qui est définie comme virtuelle et attribuée à 0.

159voto

Joel Coehoorn Points 190579

La raison vous avez une Interface spéciale type-catégorie en plus de classes de base abstraites en C# / Java est parce que C# / Java ne supportent pas l’héritage multiple.

C++ prend en charge l’héritage multiple, et donc n’est pas besoin d’un type spécial. Classe de base abstraite avec aucun non abstraite (pur virtuel) méthodes est fonctionnellement équivalent à un langage c# / interface Java.

56voto

Dima Points 19888

Il n'y a pas de notion de "interface" en soi en C++. Autant que je sache, les interfaces ont été introduites dans Java pour contourner l'absence d'héritage multiple. Ce concept s'est avéré être tout à fait utile, et le même effet peut être obtenu en C++ en utilisant une classe de base abstraite.

Une classe de base abstraite est une classe dans laquelle au moins l'un des membres de la fonction (méthode en Java le jargon) est une fonction virtuelle pure déclarées à l'aide de la syntaxe suivante:


class A
{
  virtual void foo() = 0;
};

Une classe de base abstraite ne peut pas être instanciée, j'. e. vous ne pouvez pas déclarer un objet de la classe A. Vous ne pouvez constituer des classes à partir d'Un, mais de toute classe dérivée qui ne permet pas de fournir une implémentation de la foo() sera aussi abstrait. Afin de cesser d'être abstraite, une classe dérivée doit fournir des implémentations pour toutes les fonctions virtuelles pures il hérite.

Notez qu'une classe de base abstraite peut être plus qu'une interface, car il peut contenir des données des membres et des fonctions membres qui ne sont pas du pur virtuel. L'équivalent d'une interface serait une classe de base abstraite, sans données avec seulement des fonctions virtuelles pures.

Et, comme Marque de Rançon a souligné, une classe de base abstraite doit fournir un destructeur virtuel, comme n'importe quelle classe de base, pour cette question.

45voto

Carlos C Soto Points 423

Comme beaucoup j’ai pu tester, c’est très important d’ajouter le destructeur virtuel. J’utilise les objets créés avec et détruits avec .

Si vous n’ajoutez pas le destructeur virtuel dans l’interface, le destructeur de la classe héritée n’est pas appelé.

Si vous exécutez le code précédent sans , vous verrez que le destructeur n’est jamais appelée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X