Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Palavras-Chave Virtual e Override | Visão Geral do Polimorfismo
C++ Poo
course content

Conteúdo do Curso

C++ Poo

C++ Poo

1. Fundamentos de POO em C++
2. Construtores e Destrutores
3. Visão Geral do Encapsulamento
4. Visão Geral de Herança
5. Visão Geral do Polimorfismo

book
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

Base.h

copy
1234567
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

main.cpp

copy
123456789101112131415161718192021222324252627
#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(); }
Note
Nota

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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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); }
Note
Nota

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

main.cpp

copy
1234567891011121314
#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.

question mark

Qual é o principal objetivo da palavra-chave virtual?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

course content

Conteúdo do Curso

C++ Poo

C++ Poo

1. Fundamentos de POO em C++
2. Construtores e Destrutores
3. Visão Geral do Encapsulamento
4. Visão Geral de Herança
5. Visão Geral do Polimorfismo

book
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

Base.h

copy
1234567
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

main.cpp

copy
123456789101112131415161718192021222324252627
#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(); }
Note
Nota

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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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); }
Note
Nota

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

main.cpp

copy
1234567891011121314
#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.

question mark

Qual é o principal objetivo da palavra-chave virtual?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 2
some-alt