2

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

class Rodent
{
    public:

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

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

4

6 回答 6

6

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

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

您不能创建此类的任何对象。

编辑:

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

于 2011-09-28T15:52:02.927 回答
3

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

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

于 2011-09-28T15:52:06.793 回答
2

关键字对于析构函数的virtual含义有些不同。当基类的 dtor 是虚拟的时,这意味着继承层次结构中的所有dtor 都被调用。你不能真正覆盖它。

通常你会认为它是空的:

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

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

我认为您不会通过称您的纯虚拟来混淆任何人。

于 2011-09-28T15:56:30.573 回答
2

据我了解,C++ 标准没有指定纯抽象类。然而,C++0x (n3290) 指定了abstract class

10.4/2 一个类是抽象的,如果它至少有一个纯虚函数。

纯抽象类是一个常规术语,描述了一个抽象

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

由用户指定。

所以,根据这个约定,class Rodent不是纯抽象类

于 2011-09-28T16:00:41.720 回答
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'
于 2011-09-28T16:50:57.760 回答
1

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

于 2011-09-28T15:55:16.847 回答