2012-01-04 6 views
5

Según Wikipedia, en este ejemplo:anulaciones explícita y definitiva C++ 0x

struct Base { 
    virtual void some_func(float); 
}; 

struct Derived : Base { 
    virtual void some_func(float) override; 
}; 

pensé override no era una palabra clave C++, así que lo que significa realmente? Podemos lograr lo mismo sin esa palabra clave así que ¿por qué alguien lo necesita?

También existe la palabra clave final que todavía no funciona en VS2010:

struct Base1 final { }; 

struct Derived1 : Base1 { }; // ill-formed because the class Base1 
          // has been marked final 
+1

¿No has leído el artículo de Wikipedia se vincula a? Explica por qué esa palabra clave es útil. – Mat

+2

'sealed' es la palabra clave de VC++ 2010 para' final'. – ildjarn

+0

@ildjarn: ¿En el modo Microsoft C++/CLI o en el modo Standard C++ 11? – dalle

Respuesta

16

en C++ 11, override y final son "identificadores con un significado especial". No son palabras clave y solo adquieren un significado especial si se usan en un contexto específico (al declarar funciones virtuales).

La idea es permitir al compilador detectar ciertos tipos de errores al permitir que el programador indique explícitamente su intención (por ejemplo, anular una función virtual existente en lugar de crear una nueva).

Aquí es la cita relevante de la norma, con ejemplos:

C++ 11 10,3 4 Si una función virtual f de alguna clase B está marcado con el virt-especificador final y en una clase D derivada de B una función D :: f anula B :: f, el programa está mal formado. [Ejemplo:

struct B { 
virtual void f() const final; 
}; 
struct D : B { 
void f() const; // error: D::f attempts to override final B::f 
}; 

-end ejemplo]

5 Si una función virtual está marcado con el virt-especificador override y no anula una función miembro de una clase base, el programa es tratos formado. [Ejemplo:

struct B { 
virtual void f(int); 
}; 
struct D : B { 
void f(long) override; // error: wrong signature overriding B::f 
void f(int) override; // OK 
}; 

-fin ejemplo]

+0

Gracias, pero la segunda función solo funciona cuando la firma es nula f() anula. (Lo he probado en mi editor), sin embargo, ahora lo entiendo :) – codekiddy

+0

Supongo que fue un error tipográfico. Editado –

+0

@Drew: su edición es correcta. : -] – ildjarn