2014-09-11 2 views
8

У меня есть виртуальный метод C++, который я определяю в файле .h и реализую в .cc-файле. Должна ли реализация в файле .cc быть помечена как виртуальная или просто объявление в файле .h? Например, мой заголовок имеет:Должен ли виртуальный реализатор C++ в файле .cpp быть помечен как виртуальный?

virtual std::string toString() const; 

Метод реализован в моем .cc:

std::string 
MyObject::toString() const { 
    [implementation code] 
} 

Если реализация будет отмечена виртуальной, или выше код ОК? Это имеет значение?

+1

только декларация –

+2

Это ** незаконно **, чтобы отметить реализацию как виртуальную. –

+2

Ваш компилятор даже дает вам выбор? Если да, то какой компилятор? – juanchopanza

ответ

11

C++ Standard n3337 § 7.1.2/5 говорит:

виртуальный спецификатор должен быть использован только в начальной декларации нестатические функции-члене класса;

Ключевое слово virtual может использоваться только при определении класса внутри, когда вы объявляете (или определяете) метод. Поэтому ... он может использоваться в файле реализации, но если он все еще находится в определении класса.

Пример:

class A { 
    public: 
    virtual void f(); 
}; 

virtual void A::f() {} // error: ‘virtual’ outside class declaration 
         // virtual void A::f() {} 

int main() { 
    // your code goes here 
    return 0; 
} 

http://ideone.com/eiN7bd

+0

Большое спасибо (и другим, кто ответил на основную тему). Я должен был прочитать стандарт, прежде чем спрашивать. :) –

2

В соответствии со стандартом C++ (7.1.2) Функция спецификаторов

5 Виртуальный спецификатор должны быть использованы только в начальной декларации функции нестатического класса;

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