105 votes

Obtention du message "le type source n'est pas polymorphe" lorsqu'on essaie d'utiliser dynamic_cast

struct A {};

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a);
}

donne :

impossible de dynamic_cast 'a' (de type 'struct A*') vers le type 'struct B*' (le type source n'est pas polymorphe)

Comment puis-je faire A polymorphe ? Je veux le convertir en B en toute sécurité.

(Une façon de procéder est d'ajouter une fonction virtuelle fictive, mais existe-t-il un meilleur moyen).

149voto

juanchopanza Points 115680

Vous devez faire A polymorphique, ce que vous pouvez faire en ajoutant un virtual destructeur ou toute fonction virtuelle :

struct A {
  virtual ~A() = default;
};

ou, avant C++11,

struct A {
  virtual ~A() {}
};

Notez qu'un type polymorphe devrait avoir un destructeur virtuel de toute façon, si vous avez l'intention d'appeler en toute sécurité delete sur des instances d'un type dérivé via un pointeur vers la base.

17voto

Luchian Grigore Points 136646

Vous devez avoir au moins un virtual typiquement, si aucune autre ne convient, le destructeur :

struct A {
   virtual ~A() {}
};

8voto

Andy Prowl Points 62121

Comme le dit votre compilateur, votre type A n'est pas polymorphe. Vous devez ajouter un virtual fonction. Par exemple, un virtual destructeur pourrait être un bon choix :

struct A { virtual ~A() { } };
//         ^^^^^^^ This makes A a polymorphic type

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a); // Should work now
}

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