Conteúdo do Curso
C++ Poo
C++ Poo
Palavras-Chave Virtual e Override
Palavra-chave Virtual
A palavra-chave virtual
é utilizada antes da declaração de um método em uma class
para resolver o problema discutido anteriormente. É empregada para métodos que são comuns a todas as subclasses, mas exigem implementações distintas para cada uma. Essencialmente, parece uma declaração de método comum, exceto pelo início com virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Quando uma função é declarada como virtual
em uma superclasse, permite que ela seja sobrescrita em uma subclasse. Isso significa que a subclasse pode fornecer sua própria implementação, que será invocada em vez da implementação original quando a função for chamada por meio de um ponteiro ou referência para a superclasse.
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(); }
Quando se possui um ponteiro para um objeto e deseja acessar seus membros por meio do ponteiro, utiliza-se o operador seta (->
).
Retornando à solução para o problema original com botões, esse método permite criar uma única função que recebe um ponteiro para o Button
pai como parâmetro. Assim, é possível invocar essa função passando um SubmitButton
, ResetButton
ou CancelButton
, e ela se comportará conforme o esperado.
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); }
Tente criar objetos de diferentes subclasses e passá-los para a função.
A Palavra-chave Override
A palavra-chave override
é utilizada em uma subclasse para indicar explicitamente que uma função membro sobrescreve uma função virtual da superclasse. Isso ajuda a identificar erros em tempo de compilação caso a assinatura da função na subclasse não corresponda a nenhuma função virtual na superclasse.
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() { }
Se houver um erro, como um erro de digitação na assinatura da função ou a superclasse não possuir a função que você está tentando sobrescrever, o compilador irá gerar um erro, ajudando a identificar possíveis bugs em tempo de compilação. Esse recurso é especialmente útil em ambientes de grandes equipes, onde acompanhar mudanças como renomeação de métodos pode ser desafiador.
Obrigado pelo seu feedback!