2010-10-18 3 views
0

У меня этот интерфейс. Если я получу, мне нужно снова указать format attribute? И, если класс Deriv реализует этот интерфейс, могу ли я использовать Deriv::LT_DEBUG?Нужно ли указывать атрибуты при получении классов?

class Logger 
{ 
    public: 
     enum LogType 
     { 
      LT_DEBUG = 0, 
      LT_WARNING, 
      LT_ERROR, 
      LT_STAT, 
      LT_TEXT 
     }; 

     __attribute__((format(printf, 6, 7))) 
     virtual const char* EHLog(LogType, 
       bool, 
       const char*, 
       int, 
       const char*, 
       ...) = 0; 

     virtual ~Logger(){} 
}; 
+2

Я никогда не видел таких вещей oO – ereOn

+0

Он используется для проверки правильности аргументов в вашей функции. Если вы берете переменные списки аргументов. :) – nakiya

+1

@ereOn http://unixwiz.net/techtips/gnu-c-attributes.html#format –

ответ

0

Я не мог найти какую-либо документацию на него, но я предполагаю, что __attribute__ аннотаций не неявно наследуются производным классом.
Это означает, что если вы вызываете EHLog через экземпляр, ссылку или указатель Deriv, проверка формата выполняется только в том случае, если Deriv::EHLog также указывает аннотацию __attribute__((format)).

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

Что касается второго вопроса: Да, вы можете получить доступ к именам из базового класса, используя квалификацию производного класса. Deriv::LT_DEBUG должен работать и разрешать то же имя, что и Logger::LT_DEBUG.

Смежные вопросы