адвокат по языку — Являются ли абстрактные классы C ++ неполными типами?

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

struct incomplete_type;

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

Случайно, сами абстрактные классы считаются неполные типы?

11

Решение

Нет!

Внешне они похожи (за исключением того факта, что у абстрактных классов есть определения, а у неполных типов нет):

[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

Другие решения

Других решений пока нет …