纯抽象类可以包含静态常量,静态方法还是非虚拟析构函数?

Sla*_*zer 11 c++ static abstract-class class c++11

这是一个纯粹的抽象类吗?

class C
{
public:
    static const std::string S;
    C() {}
    virtual ~C() {}
    virtual void v() = 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为不是,遵循这个[1]定义.

纯Abstract类只有抽象成员函数,没有数据或具体成员函数.

它不能是纯抽象的,因为它不只有抽象的成员函数.

  1. 它有一个虚拟析构函数,它是一个成员函数 [3],但不是抽象的.它不是纯粹的析构函数[2].注意"抽象方法"和"纯虚函数"是相同的东西[4].术语"方法"和"功能"也是同义词.
  2. 它有一个属性S,代表数据.

现在我的老师声称这是一个纯粹的抽象类,因为

纯虚拟类中包含的常量不被视为属性.它们是一个阶级的不可变元素,因此它们不违反其抽象性.这同样适用于静态方法.

[1] https://en.wikibooks.org/wiki/C%2B%2B_Programming/Classes/Abstract_Classes

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

[3] http://en.cppreference.com/w/cpp/language/destructor

[4] 抽象方法和纯虚函数是一回事吗?

Use*_*ser 1

总结一下上面的评论:

构造函数和析构函数有点特殊。要点是,对于每个可以实例化的类,它们都必须存在,即使它只能作为派生类实例的一部分进行实例化。原因是创建派生类首先构造基类,为此它需要一个构造函数。假设抽象基类没有任何数据,这个构造函数可能很简单。

(世界标准时间 2015 年 10 月 18 日 @ 13:46,乌尔里希·埃克哈特 (Ulrich Eckhardt))

C++ 标准根本没有定义术语“纯抽象类”,因此可以说 C++ 中不存在纯抽象类;或者,您可以将特定的 C++ 构造声明为“纯抽象类”,只要讨论中的其他参与者同意使用您的定义就可以。只需要求您的老师阐明他或她所使用的术语的准确定义即可;没有什么比定义性论证更能让人兴奋不已了。

(世界标准时间 2015 年 10 月 18 日 @ 14:07,作者:Igor Tandetnik)

您提供的定义在 C++ 上下文中有点无用。一方面,C++ 没有抽象成员函数(它有纯虚函数)。C++ 类(几乎)总是有一个构造函数(可能是隐式构造函数),该构造函数不能是虚拟的,因此如果您坚持将构造函数算作成员函数,则没有 C++ 类将与定义匹配。至于静态数据成员,即使具有明确抽象类概念的语言(例如Java)也不会禁止这些成员。关键是该类不应该有每个实例的数据。

(世界标准时间 2015 年 10 月 19 日 @ 02:03,作者:Igor Tandetnik)