Una función virtual hace que su clase sea clase base polimórfica. Las clases derivadas pueden anular las funciones virtuales. Las funciones virtuales llamadas a través de referencias/referencias de clase base se resolverán en tiempo de ejecución. Es decir, el dinámico tipo del objeto se utiliza en lugar de su tipo estático:
Derived d;
Base& rb = d;
// if Base::f() is virtual and Derived overrides it, Derived::f() will be called
rb.f();
Una función virtual pura es una función virtual cuya declaración termina en =0
:
class Base {
// ...
virtual void f() = 0;
// ...
Un la función virtual pura implícitamente hace que la clase esté definida para abstract (a diferencia de Java donde tienes una palabra clave para declarar explícitamente el resumen de clase). Las clases abstractas no pueden ser instanciadas. Las clases derivadas deben sobrescribir/implementar todas las funciones virtuales puras heredadas. Si no lo hacen, ellos también se volverán abstractos.
Una "característica" interesante de C++ es que una clase puede definir una función virtual pura que tiene una implementación. (What that's good for is debatable.)
Tenga en cuenta que C++ 11 trajo un nuevo uso para los delete
y default
palabras clave que parece similar a la sintaxis de las funciones virtuales puras:
my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;
Ver this question y this one para obtener más información sobre este uso de delete
y default
.
"una función virtual sin cuerpo"> eso es incorrecto. ellos pueden tener mucho cuerpo. –