2014-09-11 11 views
8

Mam wirtualną metodę C++, którą definiuję w pliku .h i implementuję w pliku .cc. Czy implementacja w pliku .cc powinna być oznaczona jako wirtualna, czy tylko deklaracja w pliku .h? Na przykład, mój nagłówek posiada:Czy wirtualna implementacja metody C++ w pliku .cpp powinna być oznaczona?

virtual std::string toString() const; 

Sposób jest realizowany w moim .cc:

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

Jeżeli realizacja oznaczone wirtualne, czy powyższy kod OK? Czy to ma znaczenie?

+1

just declaration –

+2

Jest ** nielegalny **, aby oznaczyć implementację jako wirtualną. –

+2

Czy Twój kompilator daje ci wybór? Jeśli tak, to który kompilator? – juanchopanza

Odpowiedz

11

C++ standard n3337 § 7.1.2/5 mówi:

Wirtualna specifier stosuje się tylko w początkowej deklaracji non-static function członkiem klasy;

Słowo kluczowe virtual może być używane tylko wewnątrz definicji klasy, po zadeklarowaniu (lub zdefiniowaniu) metody. Więc ... może być użyty w pliku implementacyjnym, ale jeśli nadal jest w definicji klasy.

przykład:

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

Dziękuję bardzo (i innym, którzy odpowiedzieli na główny wątek). Powinienem był przeczytać standard przed pytaniem. :) –

2

Według C++ Standard (7.1.2 Specyfikatory Function)

5 wirtualny specyfikator są używane tylko pierwotnego zgłoszenia niestatycznej funkcji członka klasy;