2010-10-01 9 views
8

Considere:pura definición virtual y en línea

struct device{ 
    virtual void switchon() = 0 {} 
}; 

int main() 
{ 

} 

escribí un código similar al siguiente y se dio un error:

pure-specifier on function-definition compilation terminated due to -Wfatal-errors.

Cuando le pregunté, me mostró la siguiente cita de la norma :

A virtual function declared in a class shall be defined, or declared pure (10.4) in that class, or both; but no diagnostic is required (3.2).

Parece que no entiendo lo que significa y creo que esto de alguna manera no es relevante.

PD: Si esta no es la cita pertinente, por favor guíanme a la correcta para que pueda tener un mejor contraargumento.

+0

Qué compilador está usando? – user200783

+3

Consulte http://stackoverflow.com/questions/2951273/pure-specifier-on-function-definition – czchen

+0

Hola, es gcc 4.1.0 – Nivhus

Respuesta

5

Una función virtual pura puede tener una definición (de definición de clase) Eso es completamente opcional. Pero lo que está tratando de hacer es erróneo porque llanura

C++ 03 [Sección 10.4/2] dice:

[Note: a function declaration cannot provide both a pure-specifier and a definition —end note] [Example:

struct C { 
    virtual void f() = 0 { }; // Ill-formed 
} 

Sin embargo, usted es libre de escribir

struct device{ 
    virtual void switchon() = 0; 
}; 

void device::switchon() { } // Definition {optional} 

int main() 
{ 

} 
+0

Sí, lo sé. Gracias. Pero quiero saber si la cita que mi colega me mostró es correcta o no en este contexto. Además, si no lo es, ¿qué significa realmente esa declaración? – Nivhus

+0

¿Qué significa si hay algo en una etiqueta [Nota] [Nota] en el Estándar? Generalmente, en mi opinión, las notas son algo que es opcional leer – Nivhus

+2

@Nivhus: Significa 'Una función virtual puede definirse en la clase, declararse pura o declararse pura y definida (definición fuera de clase) {opcionalmente} '. –

-1

Usted puede tener una función virtual "pura", es decir, clase base tiene no implementación de la función

virtual void switchon() = 0; 

y opcionalmente proporcionar una implementación que las clases derivadas debe anular.

void base_class::switchon() {} 

O

se puede tener una función virtual "no puro" y proporcionar un incumplimiento o aplicación vacío

virtual void switchon() {} 
+0

Gracias. Quiero saber si la cita que mi colega me mostró es correcta o no en este contexto – Nivhus

+1

Puede implementar una función virtual pura (lo que significa que las clases derivadas deben anularla, no es que no haya implementación). Lo que no puedes hacer es colocar el cuerpo en la declaración. –

+0

@Ben Voigt para comentar y otros usuarios que votaron negativamente: Muchas gracias. No sabía esto, aprendí algo nuevo hoy. – Arun

Cuestiones relacionadas