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

问题描述 投票:11回答:4

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

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,代表数据。

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

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

c++ class c++11 static abstract-class
4个回答
2
投票

总结以上评论:

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

(Ulrich Eckhardt于2015年10月18日@ 13:46 UTC)

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
投票

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

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

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

但是,静态成员,构造函数(甚至是空的析构函数)和非抽象析构函数都会破坏纯度。所以纯粹的抽象类看起来如下

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

1
投票

C ++标准没有定义什么是“纯抽象”类,也没有任何普遍接受的语言无关定义适用于所有语言。

你引用的定义1对我来说在C ++环境中没有多大意义。您的老师声称与语言设计更加一致。使用方便和必要的任何定义。无论如何,这个概念本身并不重要。


0
投票

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

Java接口具有:

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.