它是抽象类还是纯虚拟(接口)
Is it an abstract class or a pure virtual (interface)?
这可能是一个愚蠢的问题,但我从未见过或读过关于它的问题。
想象一下,我们有这个:
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,通常可以在接口内定义枚举。
我认为一个没有实现的类就是一个接口。
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 无法使用 SQL VDI(虚拟设备接口)创建条带化备份
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- C 接口无虚拟函数
- 从 SIOCGIFCONF 和 SIOCGIFADDR 获取的 Solaris SPARC 中虚拟接口的接口名称不正确
- 通过虚拟接口类导出C 类的可移植性
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- C++接口的公共虚拟本质与实现的私有继承
- 由于基于接口的编程,遇到 C++ 虚拟模板函数问题
- 可以通过跨二进制边界传递的对象上的接口调用虚拟函数吗?
- C++11接口纯虚拟析构函数
- cpp文件中的纯虚拟接口实现
- 虚拟HID(人接口设备)的代码示例
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 将纯虚拟接口替换为 lambda
- 具有非虚拟接口和一些私有变量的克隆方法
- VDS(虚拟磁盘服务)COM接口通知-仅在注销期间调用回调(接收器)(Unadvise)
- GotW建议不要使用公共虚拟函数,但是Java的接口呢?
- 非虚拟接口?(需要一个非常高性能的低级抽象)
- 编译器要求接口虚拟构造函数