¿Cómo puedo hacer cumplir que un método de clase base no está siendo anulado por una clase derivada?¿Cómo evitar que un método sea anulado en la clase derivada?
Respuesta
Si hace que el método no sea virtual, las clases derivadas no pueden anular el método. Sin embargo, una clase no puede anular un método de una clase base, y también previene que otras clases derivadas anulen el mismo método. Una vez que el método es virtual, se mantiene virtual.
+1: Sin embargo, la parte fue clave para mí. – imallett
con C++ 11 puede utilizar el especificador final
para evitar que se anule un método en las clases derivadas –
tharinduwijewardane
bien si quieres mantenerlo público, no lo declares virtual.
EDIT: Srikanth comentó que se preguntaba sobre anular una función miembro privada en una clase derivada.
class A
{
public:
virtual ~A(){};
void test()
{
foo();
};
private:
virtual void foo()
{
std::cout << "A";
};
};
class B : public A
{
public:
virtual void foo()
{
std::cout << "B";
};
};
void test()
{
B b;
A& a = b;
a.test(); // this calls the derived B::foo()
return 0;
}`
Las clases derivadas aún pueden anular las funciones de miembros privados virtuales. –
He editado, gracias por la corrección. –
, pero ¿cómo podemos anular un método privado sin hacer que el derivado sea un amigo o disminuir el especificador de acceso – sriks
No lo hagas virtual.
Esto no impedirá derivar de su clase y ocultar la función (proporcionando otra función miembro con el mismo nombre). Sin embargo, si su clase no está destinada a ser derivada de todos modos (sin destructor virtual, sin funciones de miembros virtuales), eso no debería ser un problema.
Por lo que sé que no puede hacer eso en C++, puede intentar declararlo como privado. . encuentre más información en este enlace http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm
Las clases derivadas aún pueden anular las funciones de miembros privados virtuales. –
Respuesta breve: no hay necesidad de eso. Larga respuesta que puede hacer some twists, pero ¿vale la pena?
Si puede utilizar el especificador final
de C++ 11, puede evitar que las clases derivadas anulen ese método. (Compiladores de Microsoft parecen apoyar la similares sealed
con una semántica similar.)
He aquí un ejemplo:
#include <iostream>
struct base {
// To derived class' developers: Thou shalt not override this method
virtual void work() final {
pre_work();
do_work();
post_work();
}
virtual void pre_work() {};
virtual void do_work() = 0;
virtual void post_work() {};
};
struct derived : public base {
// this should trigger an error:
void work() {
std::cout << "doing derived work\n";
}
void do_work() {
std::cout << "doing something really very important\n";
}
};
int main() {
derived d;
d.work();
base& b = d;
b.work();
}
Esto es lo que me sale cuando intento compilar:
$ g++ test.cc -std=c++11
test.cc:17:14: error: virtual function ‘virtual void derived::work()’
test.cc:5:22: error: overriding final function ‘virtual void base::work()’
Pregunta: ¿Por qué debería declarar "trabajo()" como "virtual" cuando no quiero que se anule en clases derivadas? ¿Por qué no simplemente marcarlo como final? – Sonic78
@ Sonic78 ¡Buena pregunta!En el código del mundo real, puede tener otra clase base para 'base', que proporciona una función virtual que desea evitar que se anule en clases derivadas de su base intermedia. – moooeeeep
- 1. Cómo evitar que se anule un método en C#
- 2. Llamar a Métodos anulado en clase derivada de la clase Base
- 3. En WPF, ¿cómo evito que mi estilo sea anulado?
- 4. Pasando clase derivada a un método que necesita para anular esperando una clase base
- 5. ¿Es posible anular un método estático en la clase derivada?
- 6. Método abstracto que devuelve una instancia de clase derivada
- 7. clase derivada Llamando al método estático de la clase base en su propio método estático
- 8. Cómo forzar a un método a ser anulado en Java?
- 9. Redefinir un typedef en la clase derivada?
- 10. clase derivada utilizando el método equivocado
- 11. cómo evitar que la clase 'a' sea heredada por otra clase?
- 12. ¿Cómo puedo llamar a un método de clase padre anulado de una clase secundaria?
- 13. ¿Cómo acceder al método protegido en la clase base de la clase derivada?
- 14. Clase base abstracta para forzar que cada clase derivada sea Singleton
- 15. Accediendo a un miembro/método de una clase derivada virtual
- 16. ¿Puedo detectar que un método ha sido anulado?
- 17. ¿Por qué deberías evitar que una clase sea subclasificada?
- 18. ¿Cómo llamar al método anulado que tiene sobrecargas?
- 19. C# ocultar Atributo en la clase derivada
- 20. C# - Cómo hacer que un método solo sea visible para las clases que heredan la clase base del método
- 21. El método tiene que ser anulado pero no es abstracto
- 22. Crear un método que sea simultáneamente un método de instancia y clase
- 23. ¿Cómo evitar que Googlebot sea un sitio abrumador?
- 24. WP7 + HTML5 - Cómo evitar que un lienzo sea seleccionado/resaltado
- 25. ¿Puedo hacer que una variable de miembro público sea privada en una clase derivada?
- 26. ¿Por qué se llama al método de clase base si la clase derivada anula el método?
- 27. ¿Cómo evitar que la región JBoss-Cache sea desalojada?
- 28. C#: ¿Cómo puedo llamar a un método estático de una clase base desde un método estático de una clase derivada?
- 29. Llamar a un método anulado, superclase a llamadas reemplazadas método
- 30. acceso de la clase base con objeto de clase derivada que tiene un método de mismo nombre
No haga es virtual en la clase base? Entonces no puede ser anulado, solo sobrecargado. No existe un equivalente directo a los métodos "finales" de Java, si esa es la pregunta. –
así que sin usar una palabra clave virtual no podemos hacerlo, entonces ¿cómo implementaron en JAVA luego – sriks
en Java, marcando un método 'final' prohíbe a las subclases implementar ese método, y el compilador y/o el verificador de código de bytes aplicarán esto . En C++, no hay forma de prohibirlo, es solo que por definición de "anulación", solo las funciones virtuales pueden ser "anuladas". –