47 votes

Que signifie l'avertissement « a une méthode virtuelle ... mais un destructeur non virtuel » lors de la compilation C++ ?

#include <iostream>
using namespace std;

class CPolygon {
  protected:
    int width, height;
  public:
    virtual int area ()
      { return (0); }
  };

class CRectangle: public CPolygon {
  public:
    int area () { return (width * height); }
  };

A un avertissement de compilation

 Class '[C@1a9e0f7' has virtual method 'area' but non-virtual destructor

Comment comprendre cet avertissement et comment améliorer le code ?

[EDIT] cette version est-elle correcte maintenant ? (Essayer de donner une réponse pour m'élucider avec le concept)

 #include <iostream>
using namespace std;

class CPolygon {
  protected:
    int width, height;
  public:
    virtual ~CPolygon(){};
    virtual int area ()
      { return (0); }
  };

class CRectangle: public CPolygon {
  public:
    int area () { return (width * height); }
    ~CRectangle(){}
  };

15voto

Tom Kerr Points 5716

cela signifie que vous avez besoin d'un destructeur virtuel sur une classe de base avec des méthodes virtuelles.

 struct Foo {
  virtual ~Foo() {}
  virtual void bar() = 0;
};

En quittant , il est hors peut conduire à un comportement non défini, apparaît généralement comme une fuite de mémoire dans des outils tels que valgrind.

2voto

Emilio Garavaglia Points 9189

Cela signifie simplement qu'un code comme

 CPolygon* p = new CRectangle;
delete p;

... ou n'importe quel emballage dans n'importe quel pointeur intelligent, ne se comportera essentiellement pas correctement car CPolygon n'est pas polymorphe lors de la suppression et la partie CRectange ne sera pas détruite correctement.

Si vous n'allez pas supprimer CRectangle et CPolygon polymorphiquement, cet avertissement n'est pas significatif.

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