2014-09-02 57 views
0

这可能是一个愚蠢的问题,但我从来没有看到有关它的问题或读过它。它是一个抽象类还是纯虚拟(接口)?

假设我们有这样的:

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

这被认为是一个接口。

现在我插入一个枚举(它可以是别的东西,像一个typedef等)

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

    virtual Numbers getNumeric() const = 0; 
}; 

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

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

+2

实质上,这是一个没有区别的区别。通常认为接口对其内部的实现没有任何意义。而抽象类被认为能够实现其中的东西。 – randomusername 2014-09-02 17:32:24

+0

你是否故意添加公共成员变量“数字”? – Horstling 2014-09-02 17:33:53

+0

@randomusername - 当你在里面说,你是指方法或类本身的内部?因为这是问题的原因。枚举在类中声明,如果一个类在类中被认为是抽象的,那么它就成为一个抽象类。我对吗? - 相反,它将是一个界面。 – yayuj 2014-09-02 17:37:26

回答

1

如果你正在寻找一个正式的答案,那么恐怕没有。

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

一个抽象类也可以被用来定义一个接口,其 派生类提供一个各种各样的实现。

整个〜1300页PDF字“接口”的所有其他情况仅指泛型编程或不相关的OOP或抽象类其他东西。

例如,这一个在这里[24.2.1 iterator.requirements.general]:

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

这显然与抽象类无关。

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

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

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

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

1

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

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

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

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

0

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

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

相关问题