2015-01-12 2 views
3

Я только один, чтобы убедиться, что никто не будет получать от моего без полиморфного класса, поэтому я использовал следующий синтаксис:Final без полиморфного класса в C++ 11

class Foo final 
{ 
    Foo(); 
    ~Foo(); // not virtual 

    void bar(); 
}; 

В ++ языка программирования C Я читал, что final может использоваться вместе с override для классов, содержащих виртуальные функции-члены. Я попробовал свой пример кода в VS 2013, и он компилируется без предупреждения.

Разрешено использовать ключевое слово final для неполиморфных классов для предотвращения вывода из класса? Имеет ли смысл ключевое слово override с неполиморфными классами?

ответ

4

Грамматика C++ позволяет final появляться в двух разных местах. Один из них - это class-virt-specifier, который может появиться после имени класса в объявлении класса, как вы его использовали. Несмотря на название, использование класса-virt-specificer не имеет ничего общего с виртуальными функциями и допускается в неполиморфных классах.

В другом месте, которое может использоваться, это virt-specifier на функцию-член. Если присутствует, то последовательность virt-specificer состоит из одного или обоих из final и override, но допускается только для виртуальных функций (9.2 [class.mem] "A virt-specifier-seq должен содержать не более одного virt-specifier. virt-specifier-seq должен появляться только в объявлении виртуальной функции-члена (10.3). "). Таким образом, override может использоваться только для виртуальных функций, поэтому их нельзя использовать в неполиморфных типах.

1

да это разрешено, даже если ваш класс не является виртуальным:

из cppreference: http://en.cppreference.com/w/cpp/language/final

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

Ключевое слово override, с другой стороны, не имеет смысла для не полиморфных классов.