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

时间:2013-05-16 20:59:36

标签: c++ language-lawyer c++14

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

struct incomplete_type;

struct abstract_class
{
   virtual void foo() = 0;
};

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

1 个答案:

答案 0 :(得分: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委员会草案。