# V016. User annotation was not applied to a virtual function. To force the annotation, use the 'enable_on_virtual' flag.

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

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

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

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

- 'enable_on_virtual' – включает работу пользовательской аннотации на виртуальной функции.
- 'propagate_on_virtual' – распространяет эффекты аннотации на переопределения виртуальной функции в дочерних классах. Кроме этого, неявно включает флаг 'enable_on_virtual'.

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

    // Комментарий должен быть расположен на одной линии
    //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'. Тогда аннотация будет применена и к переопределениям функции в дочерних классах:

    // Комментарий должен быть расположен на одной линии
    //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;
    }