2017-10-16 3 views
3

En C++, sans rendre mon destructeur virtuel Est-il encore possible de réduire les pointeurs/références de ma classe de base non polymorphe?Comment redescendre avec la classe de base non polymorphe

+0

Oui * peut * être possible, mais vous devrez utiliser 'static_cast' ou' reinterpret_cast'. * Cependant *, si la classe de base n'est pas polymorphe, et n'a pas de destructeur virtuel, alors l'héritage n'est peut-être pas le bon choix. Peut-être que vous devriez avoir la classe de base en tant que * membre * à la place? Quel est le problème * réel * que vous voulez résoudre? * Pourquoi utilisez-vous l'héritage? –

+0

Donc, est-il correct de dire que je ne peux pas tomber en panne si ma classe de base est non polymorphe (pas de méthode virtuelle/destructeur) – Adrika

+0

En utilisant 'dynamic_cast' ce n'est pas possible. –

Répondre

1

Le destructeur virtuel a peu à voir avec le downcasting. L'objectif de la création de destructeur virtuel est de permettre une suppression sécurisée grâce au pointeur vers la base.

Base * ptr = new Derived; 
delete ptr; // undefined behavior if Base destructor isn't virtual 

Downcasting peut être effectuée en utilisant static_cast, sur votre propre responsabilité

void processBase(Base * ptr) 
{ 
    // undefined behavior if ptr does not point to Derived 
    // object or some object that inherits from Derived 
    Derived * derived = static_cast<Derived *>(ptr); 
} 

Il y a aussi dynamic_cast qui vérifiera si démoralisé est légal, mais il faut que les points d'expression casté (ou fait référence) à un objet polymorphe (c'est-à-dire objet ayant au moins une fonction virtuelle déclarée ou héritée).

5.2.7.6 Dans le cas contraire, v doit être un pointeur ou une lvalue d'un type polymorphes (10,3)

Si le type d'expression n'est pas casted polymorphes, le programme ne parviendra pas à compiler. Pour résumer, créer un destructeur virtuel rendra votre classe polymorphe, mais il en sera de même en déclarant n'importe quelle autre fonction membre virtuelle. Pour utiliser dynamic_cast vous avez besoin d'un type polymorphe.

+0

'dynamic_cast' downcast sur un type non-polymorphique est mal formée. – Oktalist

+0

Cela signifie que j'ai un problème avec la compréhension de la formulation en standard. Comme ils utilisent dans cette section phrase "v a type pointeur sur cv2 D" et dans cette section, il est important de distinguer le type d'expression du type d'objet pointu, j'ai supposé que l'exigence se réfère au type complet de pointe. Cependant, ideone rejette le type d'expression non polymorphe, donc vous avez raison. –