C++ classe abstraite destructeur
Est-il judicieux (et c'est possible) pour créer une classe abstraite en utilisant seulement un destructeur virtuel pur dans la classe parent?
Voici un exemple de
class AbstractBase {
public:
AbstractBase () {}
virtual ~AbstractBase () = 0;
};
class Derived : public AbstractBase {
public:
Derived() {}
virtual ~Derived() {}
};
Sinon, comment puis-je créer une classe abstraite si les attributs et les constructeurs des produits dérivés de la classe sont tous les mêmes alors que l'autre méthode sont totalement différentes?
Appelé (vide) de l'interface et oui, il est parfaitement possible. Pour quel usage?
Alors, quelle doit être la valeur de cette classe abstraite? L'introduction d'un particulier de la hiérarchie d'héritage? N'a pas beaucoup de sens pour moi.
Pas un vide de l'interface, comme je l'ai dit. Aussi appelé "marqueur" de l'interface.
Vous avez probablement oublié le
Cette question est plus approprié pour programmers.stackexchange.com
Alors, quelle doit être la valeur de cette classe abstraite? L'introduction d'un particulier de la hiérarchie d'héritage? N'a pas beaucoup de sens pour moi.
Pas un vide de l'interface, comme je l'ai dit. Aussi appelé "marqueur" de l'interface.
Vous avez probablement oublié le
virtual
mot-clé. Mais mon point est que je ne comprends pas ce que vous souhaitez utiliser cette classe/interface pour. Il semble littéralement inutile. Non pas que je suis un expert sur le C++...Cette question est plus approprié pour programmers.stackexchange.com
OriginalL'auteur user3758182 | 2014-06-19
Vous devez vous connecter pour publier un commentaire.
Avoir qu'un pur destructeur virtuel de la classe de base est rarement une bonne pratique, mais il est possible et, dans certains cas, et même souhaitable.
Par exemple, si vous comptez sur la RTTI à envoyer des messages à un sous-objet en tentant un dynamic_cast sur le pointeur vers la classe de base, vous pouvez avoir besoin d'aucune méthode dans la classe de base sauf le destructeur. Dans ce cas, vérifiez le destructeur virtuel public.
Puisque vous n'avez pas d'autres méthodes virtuelles sauf le destructeur, vous devez vous rendre pur afin d'empêcher la création des objets de la classe de base.
Ici, il est essentiel de fournir le corps est vide pour que le destructeur (même si c'est "=0"!)
Avoir le corps permet la création de sous-classe d'objets (à condition que le sous-classe définit le destructeur et ne le définit pas comme une pure).
Êtes-vous sûr que la sous-classe doit définir un destructeur ? J'ai pu compiler un exemple dans MSVC avec =0{...code...} et un vide de la classe dérivée. Comme tu le dis, aucun objet ne peut être créé pour la classe de base (virtuelle pure), mais je peux créer un objet de la classe dérivée: Lorsqu'il est détruit, il appelle le code btw {} de la classe de base destructeur.
En d'autres termes, il est possible de créer l'objet de base seulement comme un sous-objet d'un objet de la classe dérivée. N'est-ce pas ce que l'on a naturellement envie? Ok, si vous voulez interdire la création de la sous-classe de l'objet, de définir la sous-classe de " destructeur comme virtuelle pure, trop. Il n'est pas nécessaire de définir un destructeur dans une sous-classe, mais il faut le définir si la sous-classe doit de nettoyage de certaines ressources.
OriginalL'auteur Oleg
Une interface en C++ DOIT disposer d'un destructeur virtuel qui est mis en œuvre et ne fait rien. Toutes les autres méthodes dans l'interface ont être définie comme abstraite (par exemple, l'ajout d' = 0 dans la déclaration). Cela permettra d'assurer que vous ne serez pas en mesure de créer une instance de votre classe d'interface, mais vous pouvez le supprimer de votre objet une fois que vous avez attribué votre pointeur d'interface de l'objet parent. Désolé pour la mauvaise formulation, voici un peu de code:
OriginalL'auteur armanali
Cette question me rappelle un Le vieux Chose de Nouveau post:
Vous peut créer une classe de base abstraite avec seulement un
virtual
destructeur. Je ne suis pas sûr pourquoi vous désirez. Sachant qu'un objet dérive d'un type, direFoo
, devrait-il dire que je sais ce que je peux faire avec cet objet. Dans ce cas, je sais seulement que je pouvais détruire l'objet, ce qui n'est pas utile d'informations.Mais vous avez raison la plus évidente de l'approche ne compile pas:
Lorsque j'essaie de compiler ceci, j'obtiens une erreur de lien, car, tout en
Bar::~Bar()
etBaz::~Baz()
sont définis,Foo::~Foo()
n'est pas, et le compilateur veut appelerFoo::~Foo()
chaque fois qu'unBar
ou unBaz
est détruit.Il y a deux solutions. La première est que
virtual
fonctions n'ont pas à être virtuelle pure:Mais vous avez spécifiquement demandé pour un pur destructeur virtuel. Et la réponse est certainement bizarre: des fonctions virtuelles pures peuvent être définies par la classe qui déclare virtuelle pure:
Le fait que vous peut cela ne signifie pas que c'est une bonne idée. Il est très rare que vous souhaitez déclarer une fonction virtuelle pure alors que la définition de la fonction. Il pourrait arriver, mais il sera très rare.
Je pense vraiment ce qui me dérange, c'est que la plupart des conseils de nos jours est d'utiliser des fonctions virtuelles pures pour créer quelque chose comme interfaces Java. Lorsque vous faites cela, vous déclarez les méthodes que les classes dérivées besoin de soutien, mais de laisser partir ces classes libres d'utiliser toutes les données, les membres ont du sens. Vous avez l'intention de déclarer seulement ce que les membres de données de types doit contenir, et de laisser le types gratuit avoir sauvagement différentes méthodes pour les données. Cela semble être une mauvaise idée.
OriginalL'auteur Max Lybbert