Uma função virtual em C ++ é uma função de membro dentro da classe base que redefinimos em uma classe derivada. Este artigo o ajudará a explorar o conceito em detalhes. As dicas a seguir serão abordadas neste artigo,
diferença entre classe e interface em java
- O que é função virtual?
- Regras para função virtual em C ++
- O que é vinculação?
- Encadernação antecipada
- Ligação tardia
- Função Pura Virtual
- Classe Abstrata
- Exemplo de função virtual
Então, vamos começar com este artigo sobre Função Virtual em C ++
O que é função virtual?
Uma função virtual é uma função de membro dentro da classe base que redefinimos em uma classe derivada. Ele é declarado usando a palavra-chave virtual. Quando uma classe contendo uma função virtual é herdada, a classe derivada redefine a função virtual para atender às suas próprias necessidades.
Continuando com este artigo sobre funções virtuais em C ++
Regras para função virtual em C ++:
- Eles são sempre definidos em uma classe base e substituídos na classe derivada, mas não é obrigatório substituir na classe derivada.
- As funções virtuais devem ser declaradas na seção pública da classe.
- Eles não podem ser estáticos ou função de amigo também não pode ser a função virtual de outra classe.
- As funções virtuais devem ser acessadas por meio de um ponteiro para obter o polimorfismo do tempo de execução.
Continuando com este artigo sobre funções virtuais em C ++.
O que é obrigatório?
A vinculação de funções significa que sempre que houver uma chamada de função, o compilador precisa saber com qual definição de função ela deve ser correspondida. Isso depende da assinatura de cada declaração de função e das atribuições realizadas. Além disso, o compilador precisa saber quando essa correspondência entre a chamada da função e a escolha da definição correta acontecerá.
Continuando com este artigo sobre funções virtuais em C ++
Ligação Antecipada
A vinculação inicial é um fenômeno em que a decisão de combinar várias chamadas de função ocorre no próprio tempo de compilação e o compilador associa diretamente o link aos endereços. Também é conhecido como vinculação estática ou vinculação em tempo de compilação.
- Como sabemos, escrevemos código na linguagem de alto nível
- Em seguida, o compilador converte isso em uma linguagem de baixo nível que o computador pode entender, principalmente linguagem de máquina no momento da compilação
- Na vinculação inicial, o compilador fornece diretamente o endereço da instrução de declaração de função para a instrução de chamada de função
- Assim, como o nome sugere, a vinculação ocorre muito antes de o programa ser executado.
Exemplo
#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // retorno inicial de ligação 0}
Resultado
esclarecimentos íon
Neste exemplo, criamos um ponteiro a para a classe pai Animals. Então, escrevendo a = & c, o ponteiro ‘a’ começou a se referir ao objeto c da classe Cats.
a -> sound () - Ao chamar a função sound () que está presente em ambas as classes pelo ponteiro 'a', a função da classe pai é chamada, mesmo que o ponteiro esteja se referindo ao objeto da classe Cats .
Isso se deve à vinculação antecipada. Sabemos que 'a' é um ponteiro da classe pai que se refere ao objeto da classe filha. Uma vez que a ligação inicial ocorre em tempo de compilação, portanto, quando o compilador viu que 'a' é um ponteiro da classe pai, ele combinou a chamada com a função 'sound ()' da classe pai sem procurar pelo objeto o ponteiro que está se referindo a.
Continuando com este artigo sobre funções virtuais em C ++
Late Binding
Na ligação tardia, o compilador identifica o objeto no tempo de execução e, em seguida, combina a chamada de função com a função correta. Também é conhecido como Dynamic Binding ou Runtime Binding.
A vinculação tardia no problema acima pode ser resolvida usando a palavra-chave virtual na classe base. Vamos ver como isso acontece usando o próprio exemplo acima, mas apenas adicionando a palavra-chave virtual.
Exemplo
#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}
Resultado
Explicação
Aqui, a função sound () da classe base é tornada virtual, portanto, o compilador agora executa a vinculação tardia para essa função. Agora, a chamada de função da função sound () corresponderá à definição da função em tempo de execução. Uma vez que o compilador agora identifica o ponteiro ‘a’ como referindo-se ao objeto ‘c’ da classe derivada Cats, ele chamará a função sound () da classe Cats.
Continuando com este artigo sobre funções virtuais em C ++
Função Pura Virtual
Uma função virtual pura em C ++ é uma função virtual para a qual não temos uma implementação, apenas a declaramos. Uma função virtual pura é declarada atribuindo 0 na declaração.
som vazio virtual () = 0
Aqui, sound () é uma função virtual pura.
Continuando com este artigo sobre funções virtuais em C ++
Classe Abstrata
Uma classe abstrata é definida como uma classe com uma ou mais funções virtuais puras. Conforme explicado acima, a função virtual pura é uma função de membro virtual marcada como sem implementação. Não tem implementação possível com as informações fornecidas na classe, incluindo quaisquer classes base. Uma classe abstrata também é conhecida como classe base abstrata.
Exemplo
#include using namespace std class Employee // classe base abstrata {virtual int getSalary () = 0 // função virtual pura} class Employee_1: public Employee {int salary public: Employee_1 (int s) {salary = s} int getSalary () {return salary}} class Employee_2: public Employee {int salary public: Employee_2 (int t) {salary = t} int getSalary () {return salary}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 }
Resultado
Explicação
A função ‘getSalary ()’ na classe Employee é uma função virtual pura. Como a classe Employee contém a função virtual pura, ela é uma classe base abstrata.
Uma vez que a função virtual pura é definida nas subclasses, portanto, a função ‘getSalary ()’ é definida em ambas as subclasses da classe Employee, ou seja, em Employee_1 e Employee_2.
Continuando com este artigo sobre funções virtuais em C ++
Exemplo de função virtual
# incluir usando namespace base de classe std {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { coutfunction_2 () ptr-> function_3 () ptr-> function_4 ()}
Resultado
Explicação
Para a chamada de função function_1 (), a versão da classe base da função é chamada, function_2 () é substituída na classe derivada, então a versão da classe derivada é chamada, function_3 () não é substituída na classe derivada e é uma função virtual, então a versão da classe base é chamada, similarmente, function_4 () não é sobrescrito, então a versão da classe base é chamada.
Assim, chegamos ao fim deste artigo sobre ‘Função Virtual em C ++’. Se você deseja saber mais, confira o pela Edureka, uma empresa de aprendizagem online confiável. O curso de certificação e treinamento em Java J2EE e SOA da Edureka foi projetado para treiná-lo tanto para conceitos básicos quanto avançados de Java, juntamente com várias estruturas Java como Hibernate e Spring.
Tem alguma questão para nós? Mencione isso na seção de comentários deste blog e entraremos em contato com você o mais breve possível.