C++ 虚方法但非虚析构函数
我在EclipseCDT中得到错误“类'Polygon'具有虚拟方法'area'但非虚拟析构函数”。为什么?代码段: 头文件: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
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);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。为什么要向下转换?