纯抽象类可以包含静态常量、静态方法或非虚析构函数吗?

Can a pure abstract class contain static constants, static methods or non-virtual destructors?

本文关键字:析构函数 静态方法 抽象类 包含 常量 静态      更新时间:2023-10-16

这是一个纯抽象类吗?

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

我相信它不是,根据维基教科书的定义:

纯抽象类只有抽象成员函数,没有数据或者具体的成员函数。

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

  1. 有一个虚析构函数,它是一个成员函数,但不是抽象的。它不是一个纯粹的析构函数。注意"抽象方法"answers"纯虚函数"是一回事,术语"方法"answers"函数"是同义词。
  2. 有一个属性S,表示数据。

现在我的老师声称这是一门纯粹的抽象课,因为:

纯虚类中包含的常量不被认为是属性。它们是类的不可变元素,因此不会违反类的抽象性。静态方法也是如此。

总结以上评论:

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

(10月。18, '15 @ 13:46 UTC (Ulrich Eckhardt)

c++标准根本没有定义术语"纯抽象类",所以可以认为纯抽象类在c++中不存在;或者,您可以声明一个特定的c++结构为"纯抽象类",只要讨论中的其他参与者同意使用您的定义就可以。只要让你的老师拼出他或她正在学习的术语的准确定义;没有什么比一个定义性的争论更能让人滔滔不绝的了。

(10月。18, '15 @ 14:07 UTC(作者:Igor Tandetnik)

您提供的定义在c++上下文中有点无用。首先,c++没有抽象的成员函数(只有纯虚函数)。c++类(几乎)总是有一个构造函数(可能是隐式的),它不能是虚的,所以如果坚持把构造函数算作成员函数,那么没有一个c++类会匹配这个定义。至于静态数据成员,即使是具有抽象类的显式概念的语言(例如Java)也不禁止它们。关键是类不应该有每个实例的数据。

(10月。19, '15 @ 02:03 UTC by Igor Tandetnik)

抽象类是有声明但没有定义的类

c++中的纯抽象类也被认为是接口。

因此,任何常量声明都不会违反类抽象的纯洁性。在IDL中,你可以在接口内外声明常量。

但是,静态成员、构造函数(甚至是空构造函数)和非抽象析构函数会破坏这种纯粹性。所以纯抽象类看起来像下面的

class C
{
public:
    const std::string S = "Message";
    virtual ~C() = 0;
    virtual void V() = 0;
};

c++标准没有定义什么是"纯抽象"类,也没有任何普遍接受的适用于所有语言的独立于语言的定义。

你引用的定义1对我来说在c++上下文中没有多大意义。你老师的说法更符合语言设计。使用任何方便和必要的定义。无论如何,概念本身并不重要。

来自WikiBooks的定义肯定来自java接口。后者是为了绕过单继承规则的限制而创建的。Java类可以有一个超类并实现多个接口。

Java接口有:

  1. 抽象方法
  2. <
  3. 常量/gh>静态变量和方法
  4. 默认方法。

它没有构造函数、变量和this指针。默认方法或静态方法只能访问静态变量。

使用上面的模板,你的类示例不适合 的定义,因为它定义了一个构造函数。接口没有构造函数。因此,只有默认构造函数的类才适合。在Java中没有析构函数的概念,所以在您的情况下,是否有析构函数并不重要。

c++中不需要处理java类型的接口,因为它支持多重继承。类可以任意具有抽象函数。

Java也有abstract类的概念。这类具有一个或多个抽象函数成员。它们非常类似于带有抽象函数的c++类,除了单一继承规则。在Java中也没有pure abstract类的概念(除非有人谈论接口)。