不完整的类型不能被实例化,抽象类(即具有纯虚成员函数的类)也不能被实例化。
struct incomplete_type;
struct abstract_class
{
virtual void foo() = 0;
};
抽象类本身是否被认为是不完整的类型?
不完整的类型不能被实例化,抽象类(即具有纯虚成员函数的类)也不能被实例化。
struct incomplete_type;
struct abstract_class
{
virtual void foo() = 0;
};
抽象类本身是否被认为是不完整的类型?
从表面上看,它们是相似的(除了抽象类确实有定义而不完整类型没有定义之外):
[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 委员会草案。