Contenido del Curso
POO en C++
POO en C++
Palabras Clave Virtual y Override
Palabra clave Virtual
La palabra clave virtual
se utiliza antes de la declaración de un método en una class
para resolver el problema mencionado anteriormente. Se emplea para métodos que son comunes entre todas las subclases pero requieren implementaciones distintas para cada una. Esencialmente, se parece a cualquier otra declaración de método, excepto que comienza con virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Cuando una función se declara como virtual
en una superclase, permite que sea sobrescrita en una subclase. Esto significa que la subclase puede proporcionar su propia implementación, la cual será invocada en lugar de la implementación original cuando la función se llame a través de un puntero o referencia a la superclase.
main.cpp
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Cuando se tiene un puntero a un objeto y se desea acceder a sus miembros a través del puntero, se utiliza el operador flecha (->
).
Volviendo a la solución para el problema original con los botones, este método permite crear fácilmente una única función que reciba un puntero al padre Button
como parámetro. En consecuencia, se puede invocar esta función pasando un SubmitButton
, ResetButton
o CancelButton
, y se comportará como se espera.
main.cpp
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Intenta crear objetos de diferentes subclases y pasarlos a la función.
La palabra clave Override
La palabra clave override
se utiliza en una subclase para indicar explícitamente que una función miembro sobrescribe una función virtual de una superclase. Ayuda a detectar errores en tiempo de compilación si la firma de la función en la subclase no coincide con ninguna función virtual en la superclase.
main.cpp
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }
Si hay un error, como un error tipográfico en la firma de la función o la superclase no tiene la función que intenta sobrescribir, el compilador generará un error, lo que ayuda a detectar posibles errores en tiempo de compilación. Esta característica es especialmente útil en entornos de trabajo en equipo grandes, donde el seguimiento de cambios como el cambio de nombre de métodos puede ser un desafío.
¡Gracias por tus comentarios!