2011-01-28 14 views
6

Acabo de descubrir que C++/CLI tiene una palabra clave que no está presente (AFAIK) en C++ estándar: override.Anulación explícita de la función virtual

No sé mucho sobre C++/CLI, entonces, ¿alguien puede explicar para qué propósito está incluido allí, y si es una característica deseable para ser agregado a C++?

+0

Usted no ha dicho lo que la palabra clave que está pensando es. ¿Es "explícito"? Si es así, está en C++ estándar. –

+3

@Wes Hardaker En realidad dije. Es la palabra clave "anular". – kunigami

Respuesta

12

override es una extensión de palabra clave especial de Microsoft que se puede usar en implementaciones de C++/CLI y Visual C++. Es similar a la anotación @Override en Java o override en C#, y proporciona mejores comprobaciones de tiempo de compilación en caso de que no haya anulado algo que pretendía.

Desde el primer enlace:

override indica que un miembro de un tipo administrado debe anular una clase base o un miembro de interfaz de base. Si no hay ningún miembro que sobrescribir, el compilador generará un error.

La anulación también es válida al compilar para destinos nativos (sin/clr). Consulte Anular especificadores y compilaciones nativas para obtener más información.

anular es una palabra clave contextual. Consulte Palabras clave sensibles al contexto para obtener más información.

A partir del estándar de C++ 11, el override especificador es ahora una palabra clave estandarizada. El soporte sigue siendo limitado, y según este page from Apache StdCxx, override es compatible con GCC 4.7+, Intel C++ 12.0+ y Visual C++ 2012 (con soporte de pre-estandarización en Visual C++ 2005).

0

De here:

Si marca una propiedad o un método en el una clase padre con el virtual palabra clave, cuando se deriva una clase a partir ella, puede ignorar el método o propiedad y no Impleméntalo. Pero si decide implementar la propiedad o el método, debe indicar que proporciona una nueva versión de la propiedad o el método . Proporcionar una nueva versión de una propiedad o un método es que se conoce como anulación de la misma.

Al reemplazar una propiedad o un método , debe indicarlo escribir la palabra clave override a su derecha.

Ahora sigue el link para ver algunos ejemplos.

+0

Eso explica la mecánica de la palabra clave override. No explica por qué fue introducido. –

+0

Al igual que Rob's # 2, esto no es verdad. Hacer coincidir la firma de una función declarada virtual en una clase base es suficiente para anular una función, la palabra clave 'override' se puede omitir y la función seguirá anulada. Las nuevas palabras clave no pueden hacerse obligatorias sin romper grandes cantidades de código existente. –

1

Es útil el compilador pillarse los errores de dos maneras:

  1. Si se declara una función con override en su clase, pero la clase base no tiene esa función, el compilador se puede decir que no estás invalidando lo que pensabas que eras. Si override no estuvieran disponibles, entonces el compilador no podría reconocer su error, simplemente supondría que tenía la intención de introducir una nueva función.

  2. Si tiene una función en su clase descendiente (sin override) y luego declara esa misma función como virtual en la clase base, el compilador puede decirle que su cambio en la clase base ha afectado el significado de la declaración original en el descendiente. El descendiente deberá usar override, o tendrá que cambiar la firma de una de las funciones.

Esta característica se está agregando a C++ 0x ya.

+1

No creo que el # 2 sea verdad. Puede anular las funciones sin usar realmente la palabra clave 'override'. Una gran cantidad de código existente se rompería si esto cambiara alguna vez. –

0

La palabra clave de anulación en C++/CLI proviene de .Net y no forma parte de C++. Como la anulación ya se ha explicado, debe conocer la alternativa. Si no lo "anula", puede querer que sea "nuevo". Al hacer que sea "nuevo", no está anulando el miembro de la clase principal en el hijo, sino creando un nuevo miembro con el mismo nombre. Las palabras clave nuevas e invalidadas solo difieren cuando utiliza un puntero de clase base y lo apunta a un objeto de clase derivado.

Por lo tanto, si se utiliza un puntero de clase base y el punto a un objeto de clase derivada:

If you call an "override"n member: 
     the derived class member is called 
if you call the "new"ed member: 
     the base class member is called. 
Cuestiones relacionadas