它是抽象类还是纯虚拟(接口)?

时间:2014-09-02 17:29:32

标签: c++ oop

这可能是一个愚蠢的问题,但我从来没有看到有关它的问题或阅读它。

想象一下,我们有这个:

class Numeric
{
public:
    virtual ~Numeric() {}
    virtual int getNumeric() const = 0;
};

这被视为一个界面。

现在我插入一个枚举器(它可以是其他东西,比如typedef等)。

class Numeric
{
public:
    enum Numbers
    {
        One,
        Two,
    };

    virtual Numbers getNumeric() const = 0;
};

仍然是一个界面,或者它现在被认为是一个抽象类?

正如我所说,这可能很愚蠢,但我真的很想知道。

3 个答案:

答案 0 :(得分:2)

如果您正在寻找正式答案,那么恐怕没有。

我在这里的C ++ 11标准草案只是说[10.4 class.abstract]:

  

抽象类也可用于定义其接口   派生类提供了各种实现。

“interface”一词的所有其他实例在整个~1300页PDF中仅涉及泛型编程或与OOP或抽象类无关的其他内容。< / p>

例如这里的这个[24.2.1 iterator.requirements.general]:

  

大多数库的数据运算模板   结构具有使用范围的接口。

这显然与抽象类无关。

Bjarne Stroustrup本人,如果你接受他的话作为“半官员”,在这方面也没有真正帮助你。引自glossary on his homepage

  

抽象类 - 仅定义接口的类;用作基础   类。

你将不得不忍受这样一个事实:C ++语言本身以及C ++开发人员和专家使用“interface”这个词作为超集 “抽象类”。与...不同在Java中,接口是具有自己的interface关键字的实际语言元素,在C ++中没有这样的东西。

其他一切都是基于意见的。

答案 1 :(得分:1)

您的第二课Numeric是一个界面。

如果一个类有一个或多个纯虚函数,则该类称为“抽象类”。

通常,如果所有类的函数都是纯虚函数,那么这个类称为“接口”。

C ++没有明确的interface概念,所以上面两个类被称为接口或抽象类,有点可互换。

答案 2 :(得分:0)

在我看来,你的第二堂课可以被视为一个界面。我认为没有一个标准可以定义C ++中的接口。但是,在具有接口的语言(例如Java)中,通常可以在接口内定义枚举。

我会考虑一个没有实现的类作为接口。