Чистые виртуальные конечные функции: юридические в С++ 11

class Foo
{
public: 
    virtual int foo() final = 0;
};

Скомпилируется отлично.

Разве не Foo просто пустая трата пространства и авария в процессе создания? Или я что-то упускаю?

Ответы

Ответ 1

Это почти полная потеря пространства, как вы сказали. Для этого есть хотя бы одно допущение. То, что он компилируется, кстати, не удивительно. Пока код является законным, он не должен "иметь смысл" для компиляции.

Предположим, вы хотите использовать Foo в качестве политики. Это означает, что он будет использоваться в качестве параметра шаблона, но его не нужно создавать. На самом деле, вы действительно не хотите, чтобы кто-либо когда-либо создавал экземпляр класса (хотя, по общему признанию, я не знал, почему, что может быть больно).

Это именно то, что у вас есть. Класс с типом, на который вы можете положиться, но вы не можете его создать (хотя создание частного конструктора, вероятно, будет намного более простым).

В качестве дополнительного бонуса вы можете добавить enum или статические функции внутри класса. Они могут быть использованы без создания экземпляров, и они будут находиться в пространстве имен этого класса. Итак, у вас есть класс, который в основном используется только как тип, но у вас все еще есть "некоторая функциональность", связанная с ним в виде статических функций.

В большинстве случаев можно было бы просто переносить этот материал в пространство имен, но кто знает, в какой-то ситуации это может быть желательным способом.

Ответ 2

Разве Foo не пустая трата пространства

В самом деле, это так; вы не можете создать экземпляр, поскольку он является абстрактным, и вы не можете переопределить функцию, чтобы сделать неабстрактный производный класс.

Он может использоваться как способ предотвращения создания экземпляра класса, если вы хотите сделать это по какой-либо причине; но даже тогда было бы разумнее удалить конструктор по умолчанию.

и несчастный случай при изготовлении?

Не совсем. Поскольку вы ничего не можете сделать с классом, вы не можете сделать с ним ничего плохого.

Ответ 3

Если я правильно читаю грамматику в 9.2, это действительно законно, хотя я, возможно, пропустил что-то в примечаниях, запрещающих это.

член-описатель: declarator virt-specifier-seq (opt) pure-specifier (opt)

Затем он показывает, что virt-specifier-seq может быть final, а pure-specifier - = 0

Я не вижу никакого способа, чтобы это было полезно, хотя может быть какой-то угловой случай, который его использует.