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


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

struct incomplete_type;

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

任何机会都是抽象类本身被认为是 不完整的类型


5740
2018-05-16 20:59


起源

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


答案:


没有!

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

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

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

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

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

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

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


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


15
2018-05-16 20:59



你能把它作为社区维基吗?会更清楚 - Xaqq
@Xaqq:为什么会更清楚?这是一个自我问答,使SO变得更好。我喜欢读这种问答。 - deepmax
@Xaqq:为什么? - Lightness Races in Orbit
我想社区维基是一个自我问答,不是吗? - Xaqq
@Xaqq:不,不,不是。 - Puppy