C++ 虚方法但非虚析构函数

C++ 虚方法但非虚析构函数,c++,C++,我在EclipseCDT中得到错误“类'Polygon'具有虚拟方法'area'但非虚拟析构函数”。为什么?代码段: 头文件: class Shape { public: virtual ~Shape(); protected: virtual double area() const = 0; } class Polygon : public Shape { public: ~Polygon(); protected: dou

我在EclipseCDT中得到错误“类'Polygon'具有虚拟方法'area'但非虚拟析构函数”。为什么?代码段:

头文件:

class Shape {
public:
    virtual ~Shape();
protected:
    virtual double area() const = 0;
}

class Polygon : public Shape {
    public:  
        ~Polygon();
    protected:
        double area() const;
    private:
        Vertex* vertices; 
}
实施:

Polygon::~Polygon() {delete[] this->vertices;}
double Polygon::area() const {
    ...
    return areaSum;
}

听起来像eclipse中的一个bug,或者可能是关于一个小问题的“风格”警告。多边形确实自动具有虚拟析构函数,因为它的基类析构函数是虚拟的。

请尝试以下操作:

class Shape {
public:
  virtual ~Shape() {}
protected:
  virtual double area() const = 0;
}

class Polygon : public Shape {
  public:  
      virtual ~Polygon();
  protected:
      double area() const;
  private:
      Vertex* vertices; 
 }

这对我来说是有效的,对我面临的问题也是有效的

注意:这是一个警告,不是错误。但在我看来,这是一个你不应该使用和修复的方法。@kerrek:是的,虚拟析构函数是继承的。如果基类析构函数是虚拟的,那么所有派生的析构函数也都是虚拟的。否则,您无法通过多态性从基类指针删除派生类实例。谢谢!我不知道它们不是隐式虚拟的。你在Eclipse背后使用的(大概)g++的哪个版本?@John:12.5.7:析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。为什么要向下转换?