virtual
+ final
используются в одном объявлении функции, чтобы сделать пример коротким.
Что касается синтаксиса virtual
и final
, пример из Википедии будет более выразительным, если ввести struct Base2 : Base1
с Base1, содержащей virtual void f();
, и Base2, содержащей void f() final;
(см. ниже).
Стандарт
Ссылаясь на N3690:
virtual
, так как function-specifier
может быть частью decl-specifier-seq
final
может быть частью virt-specifier-seq
Не существует правила, согласно которому необходимо использовать вместе ключевое слово virtual
и идентификаторы со специальным значением final
. Раздел 8.4, определения функций (обратите внимание, опция = необязательно):
определение функции:
атрибут-спецификатор-seq(opt) decl-specifier-seq(opt) декларатор virt-specifier-seq(opt) функция-тело
Упражняться
В C++11 вы можете опустить ключевое слово virtual
при использовании final
. Это компилируется в gcc > 4.7.1, в clang > 3.0 с C++ 11, в msvc, ... (см. обозреватель компилятора).
struct A
{
virtual void f() {}
};
struct B : A
{
void f() final {}
};
int main()
{
auto b = B();
b.f();
}
PS: пример на cppreference также не использует виртуальный вместе с final в такая же декларация.
PPS: То же самое относится и к override
.
person
Roi Danton
schedule
10.05.2018
int final = 7;
Однако, если вы хотите поговорить об этом со Страуструпом, см. здесь. - person chris   schedule 29.07.2012