C++抽象类是不完整的类型?

Lig*_*ica 11 c++ language-lawyer c++14

不完整的类型无法实例化,抽象类(即具有纯虚拟成员函数的类)也无法实例化.

struct incomplete_type;

struct abstract_class
{
   virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)

抽象类本身被认为是不完整的类型吗?

Lig*_*ica 15

没有!

表面上它们是相似的(除了抽象类确实有定义而不完整类型没有定义的事实):

[n3690: 3.9/5]: [..] 对象不应被定义为具有不完整类型.

[n3690: 10.4/2]:抽象类是一个只能用作其他类的基类的类; 除了作为派生自它的类的子对象之外,不能创建抽象类的任何对象. [..]

[n3690: 10.4/3]:抽象类不能用作参数类型,函数返回类型或显式转换的类型.可以声明指针和对抽象类的引用.

但是,该标准实际上表明这两个概念是无关的:

[n3690: 3.9/5]: 已声明但未定义的类,某些上下文(7.2)中的枚举类型,或未知大小或不完整元素类型的数组,是未完全定义的对象类型.未完全定义的对象类型和void类型是不完整的类型(3.9.1).不应将对象定义为具有不完整类型.

您的抽象类有一个定义,因此不能被认为是不完整的类型.


N3690是C++ 14委员会草案.

  • @Xaqq:为什么会更清楚?这是一个自我问答,使SO变得更好.我喜欢读这种问答. (6认同)
  • @Xaqq:不,不,不是. (5认同)
  • 你能把它作为社区维基吗?会更清楚 (3认同)