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

时间:2015-10-18 12:04:38

标签: c++ class c++11 static abstract-class

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

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

我认为不是,this definition from WikiBooks之后:

  

纯Abstract类只有抽象成员函数而没有数据   或具体成员职能。

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

  1. 它有virtual destructor, which is a member function,但不是抽象It is not a pure destructor。请注意"abstract method" and "pure virtual function" are the same things,并且术语“方法”和“函数”是同义词。
  2. 它有一个属性S ,代表数据。
  3. 现在我的老师声称这是一个纯粹的抽象类,因为:

      纯虚拟类中包含的

    常量 不被视为属性。它们是类的不可变元素,因此它们不违反其抽象性。这同样适用于静态方法

4 个答案:

答案 0 :(得分:2)

总结上述评论:

  

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

(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,Igor Tandetnik)

答案 1 :(得分:1)

  

抽象类是其中有一个声明但没有定义的类

C ++中的纯抽象类也被视为接口。

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

但是,静态成员,构造函数(即使是空的)和非抽象的析构函数也会破坏纯度。因此,纯抽象类看起来像下面的

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

答案 2 :(得分:1)

C ++标准没有定义什么是“纯抽象”类,也没有任何普遍接受的独立于语言的定义可以平等地适用于所有语言。

在C ++上下文中,您引用的定义1对我来说没有多大意义。您的老师声称的内容与语言设计更加一致。使用方便且必要的任何定义。在任何情况下,概念本身都不重要。

答案 3 :(得分:0)

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

Java接口具有:

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

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

使用以上作为模板,您的类示例不适合定义,因为它定义了构造函数。接口没有构造函数。因此,仅具有默认构造函数的类将适合。 Java中没有析构函数的概念,因此无论您是否具有析构函数都没有关系。

C ++不需要处理Java类型的接口,因为它支持多重继承。这些类可以具有抽象功能。

Java还具有abstract类的概念。这是具有一个或多个抽象函数成员的类。它们与具有抽象功能的C ++类非常相似,除了单个继承规则。 Java也没有pure abstract类的概念(除非有人谈论接口)。