Comment puis-je configurer une classe qui représente une interface ? Est-ce juste une classe de base abstraite ?
Réponses
Trop de publicités?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
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.
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.
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.