﻿# V016\. User annotation was not applied to a virtual function\. To force the annotation, use the 'enable\_on\_virtual' flag\.

При помощи механизма пользовательских аннотаций можно дополнительно настроить диагностические правила анализатора\. Одним из вариантов пользовательских аннотаций являются аннотации функций\.

Пример такой аннотации:

```cpp
//V_FORMATTED_IO_FUNC, function:Log, format_arg:1, ellipsis_arg:2
void Log(const char *fmt, ...);
```

Однако аннотации по умолчанию не применяются к виртуальным функциям\. Диагностическое предупреждение V016 сообщает пользователю о том, что его аннотация не была применена к виртуальной функции, и рекомендует исправить это при помощи специальных флагов, которые дописываются в аннотацию:

1. 'enable\_on\_virtual' – включает работу пользовательской аннотации на виртуальной функции\.
1. 'propagate\_on\_virtual' – распространяет эффекты аннотации на переопределения виртуальной функции в дочерних классах\. Кроме этого, неявно включает флаг 'enable\_on\_virtual'\.

Например, аннотация для виртуальной функции 'Log' класса 'Base' будет выглядеть следующим образом:

```cpp
// Комментарий должен быть расположен на одной линии
//V_FORMATTED_IO_FUNC, function:Base::Log,
                       format_arg:1, ellipsis_arg:2,
                       enable_on_virtual
struct Base
{
  virtual void Log(const char *fmt, ...);
}
```

Вместо 'enable\_on\_virtual' может быть указан флаг 'propagate\_on\_virtual'\. Тогда аннотация будет применена и к переопределениям функции в дочерних классах:

```cpp
// Комментарий должен быть расположен на одной линии
//V_FORMATTED_IO_FUNC, function: Base::Log,
                       format_arg:1, ellipsis_arg:2,
                       propagate_on_virtual
struct Base
{
  virtual void Log(const char *fmt, ...);
}

struct Derived
{
  // Аннотация будет действовать и на эту функцию
  virtual void Log(const char *fmt, ...) override;
}
```