C++抽象类是不完全类型吗?

11

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

struct incomplete_type;

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

请问抽象类本身是否被视为不完全类型


2
苏格拉底是一个人,我也是一个人;那么我就是苏格拉底吗? <g> - Pete Becker
@PeteBecker:仅仅因为不存在因果关系,并不意味着两个事实都不真实!的确,就我所知,你可能是苏格拉底。 :) - Lightness Races in Orbit
1个回答

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委员会草案。


6
为什么这会更加清晰?这是一种自问自答的方式,可以使 Stack Overflow 更好。我喜欢阅读这种类型的问答。 - masoud
那是我的错。我以为社区维基会将问题和答案合并在一个帖子中。不过,这是一篇不错的帖子 :) - Xaqq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接