¿Es posible hacer que mis funciones miembro final
estén en Java, para que las clases derivadas no puedan anularlas?Cómo definir las funciones miembro 'final' para una clase
Respuesta
Es muy posible que sea, de hecho, el comportamiento predeterminado. Es decir. si no declara los métodos de instancia de clase explícitamente como virtual
, no pueden ser overridden en subclases (solo hidden, que es un caso diferente, y casi siempre erróneo).
Eficaz C++ tercera edición, el artículo 36 se ocupa de esto en detalle. Considere
class B {
public:
virtual void vf();
void mf();
virtual void mf(int);
...
};
class D: public B {
public:
virtual void vf(); // overrides B::vf
void mf(); // hides B::mf; see Item33
...
};
D x; // x is an object of type D
B *pB = &x; // get pointer to x
D *pD = &x; // get pointer to x
pD->vf(); // calls D::mf, as expected
pB->vf(); // calls D::mf, as expected
pD->mf(); // calls D::mf, as expected
pB->mf(); // calls B::mf - surprise!
pD->mf(1); // error - D::mf() hides B::mf(int)!
pB->mf(1); // calls B::mf(int)
Así que esto no es exactamente cómo se comporta final
en Java, pero sólo se puede obtener esta estrecha con C++. Una alternativa podría ser evitar la subclasificación por completo. La solución técnica - de trabajo, pero no agradable - es declarar todos sus constructores private
(y proporcionar un método de fábrica estático si desea permitir la creación de instancias de su clase, por supuesto).
si no entendí mal, entonces 'Anulación' es ocultar la copia de la clase base, lo cual es muy posible en este caso. Lo que quiero es forzar a las clases derivadas a usar/llamar siempre la copia de la función de la clase base. – Hemant
@Hemant, vea los enlaces y el ejemplo de código que agregué. –
No sé Java, pero por lo que escuché, pensé en Java que ni siquiera se podía declarar 'D :: mf()'. – sbi
Comprobar this de Bjarne (¿Puedo detener personas que deriva de mi clase?)
En realidad es posible si está utilizando MSVC. Hay una palabra clave sealed
. Aquí hay un example from msdn.
C++ 11 añade una palabra clave contextual final
para apoyar esta:
class B
{
public:
virtual void foo() final;
};
class D : B
{
public:
virtual void foo(); // error: declaration of 'foo' overrides a 'final' function
};
final
se admite en GCC 4.7 y 3.0 Clang. Y como señala Sergio en su respuesta, MSVC++ lo admite (con la ortografía sealed
), desde MSVC++ 2005. Entonces, si encapsula en una minimacro macro y lo configura dependiendo de su compilador, puede estar en camino con esto. Solo asegúrese de que en realidad es usando tal compilador al menos cada cierto tiempo, por lo que detectará cualquier error con anticipación.
¡El nuevo estándar C++ 11 ahora admite anulaciones explícitas y final de las funciones de miembro!
- 1. ¿Es posible definir un bloque como miembro de una clase?
- 2. ¿Cómo asociar funciones no miembro con una clase en Doxygen?
- 3. ¿Cuándo debería preferir las funciones de no amigo no miembro a las funciones de miembro?
- 4. decltype para funciones miembro
- 5. ¿pueden usarse las funciones miembro para inicializar las variables miembro en una lista de inicialización?
- 6. Definir una variable en una clase y usarla en las funciones
- 7. Diferencia entre las funciones de miembro para una clase de plantilla definida dentro y fuera de la clase
- 8. ¿Cómo definir correctamente las propiedades de clase?
- 9. Funciones de miembro estático
- 10. ¿Por qué las funciones miembro de la clase sombrean funciones libres con el mismo nombre?
- 11. C++ definir struct miembro de la clase y devolverlo en una función miembro
- 12. Funciones de miembro constante
- 13. C++ efectivo Artículo 23 Prefiere funciones no miembro no miembro a funciones miembro
- 14. asignación de memoria para las funciones miembro de clase de C++
- 15. ¿Es posible definir miembro en una clase secundaria sin definirlo en la clase principal abstracta? C#
- 16. funciones miembro sobrecargados para una plantilla determinada especialización
- 17. funciones miembro std :: hilo
- 18. Funciones no miembro no miembro frente a funciones privadas
- 19. Cómo definir un puntero de función de miembro general
- 20. Python definir funciones dinámicas
- 21. Cómo definir una clase en Python
- 22. ¿Circunstancias para hacer una clase final?
- 23. ¿Cómo implementar las funciones miembro de clase estática en el archivo * .cpp?
- 24. ¿Cómo anulo las funciones de una clase padre en python?
- 25. C++ equivalente para java datos de miembro final
- 26. Haskell: ¿Cómo puedo definir una clase de tipo para conjuntos?
- 27. Cómo definir una clase debe heredar
- 28. Funciones de miembro no miembro frente a miembro en Python
- 29. ¿Cuáles son todas las funciones miembro creadas por el compilador para una clase? ¿Eso sucede todo el tiempo?
- 30. Definir funciones en estructuras
Pregunta interesante para hacer en una entrevista ... ya que la respuesta es no hacer nada. (Creo). – Stephen
No Funciones especiales en C++ evitar en sobrescribir, simplemente declarar virtual y anular. – ratty
La pregunta no es muy clara. Que se haya molestado en preguntarlo implicaba, a mi entender, que estaba hablando de funciones virtuales, en cuyo caso la respuesta es no: una clase derivada de cualquier clase con una función virtual especificada en un ancestro puede anular la función. Como otros han señalado, sin "virtual", no se pueden anular todas las funciones. No sé Java, así que no estoy seguro de qué permite cuando .... –