позиция виртуального ключевого слова в объявлении функции - PullRequest
3 голосов
/ 07 марта 2012

Имеет ли какое-либо значение, помещаю ли я ключевое слово virtual в объявление функции до или после типа возвращаемого значения?

virtual void DoSomething() = 0;
void virtual DoSomething() = 0;

Нашел синтаксис void virtual при рефакторинге некоторого унаследованного кода ибыло интересно, что он компилируется вообще ...

Ответы [ 4 ]

5 голосов
/ 07 марта 2012

Оба утверждения эквивалентны.
Но 1-й более условен. Потому что обычно обязательные поля сохраняются ближе всего к любому синтаксису (т. Е. Прототип функции в вашем примере).

virtual - необязательное ключевое слово (хотя оно необходимо для чистого virtual). Однако тип возвращаемого значения (здесь void) является обязательным ключевым словом, которое всегда обязательно. Таким образом, люди держат virtual слева, а тип return чуть ближе к сигнатуре функции.

Другой пример: я обычно вижу, что в приведенном ниже коде 1-й синтаксис более популярен по той же причине:

const int i = 0;  // 1
int const i = 0;  // 2
3 голосов
/ 07 марта 2012

Нет никакой разницы между ними, C ++ грамматика позволяет виртуальному ключевому слову появляться как до, так и после возвращаемого типа. Обычно это ставится первым в декларации.

1 голос
/ 07 марта 2012

Оба формата работают, но стандарт определяет первый формат.

Ссылка:
C ++ 03 7.1 Спецификаторы

Спецификаторы, которые можно использовать в объявлении:

   decl-specifier:
         storage-class-specifier
         type-specifier
         function-specifier
         friend
         typedef

     decl-specifier-seq:
           decl-specifier-seqopt decl-specifier

И далее function-specifier объясняется в,

7.1.2 Спецификаторах функций

Спецификаторы функций могут использоваться только в объявлениях функций.

 function-specifier:
     inline
     virtual
     explicit
0 голосов
/ 07 марта 2012

протестировано только сейчас:

компилирует оба пути.

Обычный виртуальный ставится перед типом возврата.

подробнее здесь: http://msdn.microsoft.com/en-us/library/0y01k918%28v=vs.80%29.aspx

...