2014-09-11 22 views
8

Ho un metodo C++ virtuale che sto definendo in un file .h e implementato in un file .cc. L'implementazione nel file .cc deve essere contrassegnata come virtuale o solo la dichiarazione nel file .h? Per esempio, la mia intestazione ha:Un'implementazione del metodo C++ virtuale nel file .cpp deve essere contrassegnata come virtuale?

virtual std::string toString() const; 

Il metodo è implementato nel mio .cc:

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

qualora l'attuazione risulti contrassegnato virtuale, o è il codice di cui sopra OK? Importa?

+1

solo dichiarazione –

+2

È ** illegale ** contrassegnare l'implementazione come virtuale. –

+2

Il tuo compilatore ti dà anche una scelta? Se sì, quale compilatore? – juanchopanza

risposta

11

C++ standard n3337 § 7.1.2/5 dice:

L'identificatore virtuale è utilizzato soltanto nella dichiarazione iniziale di una funzione membro della classe non statica;

La parola chiave virtual può essere utilizzata solo all'interno della definizione di classe, quando si dichiara (o definisce) il metodo. Quindi ... può essere usato nel file di implementazione ma se è ancora in definizione di classe.

Esempio:

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

Grazie mille (e agli altri che hanno risposto sul thread principale). Avrei dovuto leggere lo standard prima di chiedere. :) –

2

Secondo l'++ standard C (7.1.2 prescrittori Function)

5 L'identificatore virtuale deve essere utilizzato solo nella dichiarazione iniziale di una funzione membro della classe non statica;

Problemi correlati