чисто виртуальные конечные функции: легально в C ++ 11

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

Компилирует нормально.

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

17

Решение

это почти полная трата пространства, как вы сказали. Есть по крайней мере одно заведомо искусственное использование для этого. То, что он компилируется, кстати, неудивительно. Пока код легитимен, ему не нужно «иметь смысл» для компиляции.

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

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

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

Большую часть времени, вероятно, можно было бы просто обернуть эти вещи в пространство имен, но кто знает, в некоторых ситуациях это может быть желаемым способом.

15

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

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

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

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

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

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

8

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

член-описатель:
описатель virt-specier-seq (opt) pure-спецификатор (opt)

Тогда это показывает, что virt-specifier-seq может быть final а также pure-specifier является = 0

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

3
По вопросам рекламы [email protected]