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

Is it an abstract class or a pure virtual (interface)?

本文关键字:接口 虚拟 抽象类      更新时间:2023-10-16

这可能是一个愚蠢的问题,但我从未见过或读过关于它的问题。

想象一下,我们有这个:

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

这被认为是一个接口。

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

class Numeric
{
public:
    enum Numbers
    {
        One,
        Two,
    };
    virtual Numbers getNumeric() const = 0;
};

仍然是一个接口,还是它现在被认为是一个抽象类?

正如我所说,这可能很傻,但我真的很想知道这一点。

如果你正在寻找官方答案,恐怕没有。

我在这里看到的C++11标准草案只是说[10.4类摘要]:

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

整个约1300页PDF中"接口"一词的所有其他实例仅指通用编程或与OOP或抽象类无关的其他事物。

例如这里的这个[224.2.1迭代器.requestions.general]:

图书馆对数据进行操作的大多数算法模板结构具有使用范围的接口。

这显然与抽象类无关。

Bjarne Stroustrup本人,如果你接受他的话作为"半官方",在这方面也不会真正帮助你。引用他主页上的词汇表:

抽象类-仅定义接口的类;用作底座班

您将不得不接受这样一个事实,即C++语言本身以及C++开发人员和专家将"接口"一词用作超集"抽象类"

其他一切都是基于观点的。

您的第二个类Numeric是一个接口。

如果一个类有一个或多个纯虚拟函数,那么这个类被称为"抽象类"。

一般来说,如果一个类的所有函数都是纯虚拟函数,那么这个类被称为"接口"。

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

在我看来,您的第二个类可以被视为一个接口。我不认为有一个标准可以定义C++中的接口。然而,在有接口的语言中,例如Java,通常可以在接口内定义枚举。

我认为一个没有实现的类就是一个接口。