【发布时间】:2012-02-04 13:36:48
【问题描述】:
#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); }
};
有编译警告
Class '[C@1a9e0f7' has virtual method 'area' but non-virtual destructor
如何理解这个警告以及如何改进代码?
[EDIT] 这个版本现在正确吗? (试图给出答案以阐明自己的概念)
#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(){}
};
【问题讨论】:
-
是的,新版本是正确的。尽管将派生类中的函数重新声明为虚拟函数被认为是一种很好的形式,尽管这不是必需的。这样一来只想看派生类的人还是知道函数是虚的。
-
你的意思是
class CRectangle: public CPolygon { public: virtual int area () { return (width * height); } };? -
是的。还有
virtual ~CRectangle() {}。正如我所说,重申这些函数是虚拟的只是一种很好的形式,语言无论如何都不需要它。 -
@Problemania 为什么你的例子中有分号:
virtual ~CPolygon(){};同时@Omnifarious 在上面的例子中没有分号? -
@CommaToast:
;完全是多余的。就其本身而言,这只是一句空话。有时您想要一个空语句作为while或for循环的主体,其中所有操作都带有副作用。我从未见过在声明中间使用过一个,我敢肯定它的包含是意外或混乱。
标签: c++ polymorphism virtual