在C编译过程中,“有虚拟方法…但是非虚拟析构函数”是什么意思?

#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(){}
  };
最佳答案
如果一个类有一个虚拟方法,那意味着你希望其他类继承它。这些类可以通过基类引用或指针进行销毁,但是只有在基类具有虚拟析构函数的情况下才会有效。如果你有一个应该是多态的可用的类,它也应该是多态的可删除。

这个问题也深入了解了here.以下是一个完整的示例程序,演示了如下效果:

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

输出:

Destructor of FooBase
Destructor of Bar
Destructor of BarBase

注意删除栏;导致两个析构函数〜Bar和〜BarBase被调用,同时delete foo;只叫〜FooBase。后者甚至是undefined behavior,所以效果不能保证。

转载注明原文:在C编译过程中,“有虚拟方法…但是非虚拟析构函数”是什么意思? - 代码日志