虚方法但非虚析构函数

7
在Eclipse CDT中,我遇到了“类'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;
}

1
注意:这是一个警告而不是错误。但我认为你应该注意并修复它。 - Martin York
4
如果一个基类析构函数是虚的,那么所有派生类的析构函数都是虚的。这是因为如果不这样做,你就无法通过多态性使用基类指针来删除派生类实例。 - Remy Lebeau
显然这取决于编译器。例如,在Borland/CodeGear/Embarcadero C++编译器中,如果基类析构函数是虚拟的,那么派生析构函数就是隐式虚拟的。 - Remy Lebeau
嗯,我不是很确定。我几个月前安装了某种Cygwin编译器,可能是那个。 - Emil
4
12.5.7:析构函数可以被声明为虚拟的(10.3)或纯虚拟的(10.4);如果在程序中创建了该类或任何派生类的对象,则必须定义析构函数。如果一个类具有一个带有虚拟析构函数的基类,则其析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。 - SSJ_GZ
显示剩余10条评论
2个回答

7

听起来像是eclipse中的一个错误,或者可能是关于一个小问题的“样式”警告。Polygon自动具有虚析构函数,因为它的基类析构函数是虚函数。


-2

试试这个:

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

这对我来说有效,解决了我遇到的问题!


为什么要进行向下转型? - parasrish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接