我正在进行一项练习,要求我使用基类Rodent并使其成为一个纯粹的抽象类。我对纯抽象类的理解是它充当接口并且只包含纯虚函数。虽然这是一个简单的练习,但我对本书提供的解决方案有疑问:
class Rodent
{
public:
virtual ~Rodent() {cout << "Destroy rodent" << endl;}
virtual void run() = 0;
virtual void squeak() = 0;
};
正如您所看到的,作者为析构函数添加了一个虚拟定义。添加这个定义是否意味着这不是一个抽象类而不是一个“纯粹的”抽象类?
答案 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是功能性的。