2

Dire que j'ai deux classes de base,Le destructeur d'une classe de base que vous n'utiliserez pas pour supprimer un objet, doit-il être virtuel?

struct A {}; 
struct B {}; 

et un dérivé qui utilise l'héritage multiple

struct D : A, B {}; 

Si mon scénario d'utilisation va quelque chose comme ceci:

A *obj = new D; 

-à-dire Je n'utiliserai jamais la classe de base B pour faire référence à l'objet dérivé, dois-je rendre le destructeur des deux bases virtuel? Je déclare actuellement le destructeur de B comme protected pour interdire à d'autres utilisateurs de le faire, mais est-ce suffisant? Le destructeur de D?

+0

Non, mais vous devriez. –

+3

Si vous ne faites jamais référence à 'D' en tant que' B' vous pourriez être intéressé par l'héritage ['protected' ou' private'.] (Http://stackoverflow.com/questions/860339/difference-between -private-public-and-protected-inheritance) – jaggedSpire

+2

Pour citer le puissant Scott Meyers: * ... déclare un destructeur virtuel dans une classe si et seulement si cette classe contient au moins une fonction virtuelle *. –

Répondre

7

Il n'est pas nécessaire que le destructeur B soit virtuel tant qu'un B* n'est jamais utilisé pour supprimer des objets dérivés. Voir [expr.delete]/3:

... si le type statique de l'objet à supprimer est différent de son type dynamique , le type statique doit être une classe de base du type dynamique du objet à supprimer et le type statique doit avoir un destructeur virtuel ou le comportement est indéfini.

Dans ce cas, le "type statique" est le type Tcv où l'opérande delete a le type Tcv*. Donc, les exigences dans votre cas sont imposées sur A, pas sur B.