Являются ли абстрактные классы С++ неполными?

Неполные типы не могут быть созданы, и абстрактные классы (то есть те, у которых есть виртуальные функции-члены) также не могут быть созданы.

struct incomplete_type;

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

Каким-либо образом сами абстрактные классы считаются неполными?

Ответ 1

Нет!

Поверхностно они похожи (кроме того, что абстрактные классы имеют определения, тогда как неполные типы не имеют):

[n3690: 3.9/5]: [..] Объекты не должны быть определены как неполные.

[n3690: 10.4/2]: Абстрактный класс - это класс, который может использоваться только как базовый класс какого-либо другого класса; не могут быть созданы объекты абстрактного класса, кроме как субобъекты производного от него класса. [..]

[n3690: 10.4/3]: Абстрактный класс не должен использоваться как тип параметра, как возвращаемый тип функции или как тип явного преобразования. Указатели и ссылки на абстрактный класс могут быть объявлены.

Однако стандарт действительно дает понять, что эти два понятия не связаны:

[n3690: 3.9/5]: Класс, который был объявлен, но не определен, тип перечисления в определенных контекстах (7.2) или массив неизвестного размера или неполного типа элемента, - это не полностью определенный тип объекта. Неполно определенные типы объектов, а типы void являются неполными типами (3.9.1). Объекты не должны быть определены как неполные.

Ваш абстрактный класс имеет определение и поэтому не может считаться неполным.


N3690 - это проект Комитета С++ 14.