如果一个类有一个非纯粹的析构函数,它仍然可以是纯抽象的吗?

时间:2011-09-28 15:49:18

标签: c++ class abstract pure-virtual

我正在进行一项练习,要求我使用基类Rodent并使其成为一个纯粹的抽象类。我对纯抽象类的理解是它充当接口并且只包含纯虚函数。虽然这是一个简单的练习,但我对本书提供的解决方案有疑问:

class Rodent
{
    public:

    virtual ~Rodent() {cout << "Destroy rodent" << endl;}
    virtual void run() = 0;
    virtual void squeak() = 0;
};

正如您所看到的,作者为析构函数添加了一个虚拟定义。添加这个定义是否意味着这不是一个抽象类而不是一个“纯粹的”抽象类?

6 个答案:

答案 0 :(得分:5)

抽象类必须包含至少一个纯虚函数。

你的类已经有两个纯虚函数run()squeak(),所以你的类是抽象的,因为这两个纯虚函数。

您无法创建此类的任何对象。

编辑:

纯抽象类是一个专门具有纯虚函数(没有数据)的类。 由于您的析构函数不是纯虚拟的,因此您的类不是纯抽象类。

答案 1 :(得分:3)

根据C ++规则,每个类都需要析构函数。如果您不提供,编译器将为您生成一个。

在我看来,这仍然是一个纯粹的抽象类,因为析构函数是规则的一个例外。

答案 2 :(得分:2)

virtual关键字对于析构函数来说意味着一些不同。当基类的dtors是虚拟的时,意味着调用继承层次结构中的所有 dtors。你无法真正覆盖它。

通常你会期望它是空的:

class Rodent {
public:
  virtual ~Rodent() {}
  virtual void run() = 0;
  virtual void squeak() = 0;
};

我看到的差别很小。有可能因为空体是无操作,编译器可以通过某种语言律师法规忽略它。

我不认为你会把你称为虚拟虚拟,从而混淆任何人。

答案 3 :(得分:2)

据我了解,C ++标准没有指定纯抽象类。但是,C ++ 0x(n3290)指定抽象类

  

10.4 / 2如果一个类至少有一个纯虚拟,则它是抽象的   功能

纯抽象类是一个传统术语,描述了抽象类;

  • 没有数据成员
  • 没有任何非纯虚函数
  • 没有任何具体功能

由用户指定。

所以,根据这个惯例,class Rodent不是纯抽象类

答案 4 :(得分:2)

考虑实现您的界面

class Rodent {
public:
  virtual ~Rodent() = 0;
  virtual void run() = 0;
  virtual void squeak() = 0;
};
inline Rodent::~Rodent() {}

将析构函数指定为纯虚拟内容并内联实现可避免在导出子类时MSVC2010中出现以下警告:

warning C4275: non dll-interface class 'A' used as base for dll-interface class 'B'

答案 5 :(得分:1)

是的,它不再是一个纯粹的阶级了。一个纯粹的抽象类没有功能,它只是提供了一个框架。 cout是功能性的。