virtuales una subprogramas significa que puro pura polimorfismo modificador herencia funcion entre diferencia declara como c++ polymorphism virtual

una - ¿Qué significa la advertencia ''tiene el método virtual... pero el destructor no virtual'' durante la compilación de C++?



que significa virtual en c++ (3)

Si una clase tiene un método virtual, eso significa que quiere que otras clases la hereden. Estas clases podrían destruirse mediante una referencia de clase base o un puntero, pero esto solo funcionaría si la clase base tiene un destructor virtual. Si tiene una clase que se supone que se puede utilizar de forma polimórfica, también se puede eliminar de forma polimórfica

Esta pregunta también se responde en profundidad here . El siguiente es un programa de ejemplo completo que demuestra el efecto:

#include <iostream> class FooBase { public: ~FooBase() { std::cout << "Destructor of FooBase" << std::endl; } }; class Foo : public FooBase { public: ~Foo() { std::cout << "Destructor of Foo" << std::endl; } }; class BarBase { public: virtual ~BarBase() { std::cout << "Destructor of BarBase" << std::endl; } }; class Bar : public BarBase { public: ~Bar() { std::cout << "Destructor of Bar" << std::endl; } }; int main() { FooBase * foo = new Foo; delete foo; // deletes only FooBase-part of Foo-object; BarBase * bar = new Bar; delete bar; // deletes complete object }

Salida:

Destructor of FooBase Destructor of Bar Destructor of BarBase

Tenga en cuenta que delete bar; hace que se ~BarBase a ambos destructores, ~Bar y ~BarBase , mientras que delete foo; solo llamadas ~FooBase . Este último es incluso un comportamiento indefinido , por lo que el efecto no está garantizado.

#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); } };

Tiene aviso de compilación

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

¿Cómo entender esta advertencia y cómo mejorar el código?

[EDIT] es esta versión correcta ahora? (Tratando de dar respuesta para aclararme con el concepto)

#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(){} };


Simplemente significa que un código como

CPolygon* p = new CRectangle; delete p;

... o lo que sea que se envuelva en cualquier puntero inteligente, esencialmente no se comportará correctamente, ya que CPolygon no es polimórfico al eliminarlo, y la parte CRectange no se destruirá correctamente.

Si no va a eliminar la polimorfismo de CRectangle y CPolygon, esa advertencia no es significativa.


significa que necesita un destructor virtual en una clase base con métodos virtuales.

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

Dejarlo apagado puede llevar a un comportamiento indefinido, usualmente se muestra como una pérdida de memoria en herramientas como valgrind.