logo

Função virtual C++

  • Uma função virtual C++ é uma função membro na classe base que você redefine em uma classe derivada. É declarado usando a palavra-chave virtual.
  • É usado para informar ao compilador para executar ligação dinâmica ou ligação tardia na função.
  • É necessário usar o ponteiro único para se referir a todos os objetos das diferentes classes. Assim, criamos o ponteiro para a classe base que se refere a todos os objetos derivados. Mas, quando o ponteiro da classe base contém o endereço do objeto da classe derivada, sempre executa a função da classe base. Este problema só pode ser resolvido usando a função 'virtual'.
  • Um 'virtual' é uma palavra-chave que precede a declaração normal de uma função.
  • Quando a função se torna virtual, o C++ determina qual função deve ser invocada no tempo de execução com base no tipo do objeto apontado pelo ponteiro da classe base.

Ligação tardia ou ligação dinâmica

Na ligação tardia, a chamada de função é resolvida durante o tempo de execução. Portanto, o compilador determina o tipo de objeto em tempo de execução e, em seguida, vincula a chamada de função.


Regras da Função Virtual

java instanciado
  • As funções virtuais devem ser membros de alguma classe.
  • Funções virtuais não podem ser membros estáticos.
  • Eles são acessados ​​através de ponteiros de objetos.
  • Eles podem ser amigos de outra classe.
  • Uma função virtual deve ser definida na classe base, mesmo que não seja usada.
  • Os protótipos de uma função virtual da classe base e de todas as classes derivadas devem ser idênticos. Se as duas funções tiverem o mesmo nome, mas protótipos diferentes, o C++ as considerará como funções sobrecarregadas.
  • Não podemos ter um construtor virtual, mas podemos ter um destruidor virtual
  • Considere a situação em que não usamos a palavra-chave virtual.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

Saída:

 Value of x is : 5 

No exemplo acima, * a é o ponteiro da classe base. O ponteiro só pode acessar os membros da classe base, mas não os membros da classe derivada. Embora C++ permita que o ponteiro base aponte para qualquer objeto derivado da classe base, ele não pode acessar diretamente os membros da classe derivada. Portanto, há necessidade de uma função virtual que permita ao ponteiro base acessar os membros da classe derivada.

Exemplo de função virtual C++

Vamos ver o exemplo simples de função virtual C++ usada para invocar a classe derivada em um programa.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

Saída:

 Derived Class is invoked 

Função Virtual Pura

  • Uma função virtual não é usada para executar nenhuma tarefa. Ele serve apenas como um espaço reservado.
  • Quando a função não tem definição, tal função é conhecida como ' fazer nada 'função.
  • O ' fazer nada 'função é conhecida como função virtual pura . Uma função virtual pura é uma função declarada na classe base que não possui definição relativa à classe base.
  • Uma classe contendo a função virtual pura não pode ser usada para declarar seus próprios objetos; tais classes são conhecidas como classes base abstratas.
  • O objetivo principal da classe base é fornecer as características para as classes derivadas e criar o ponteiro base usado para atingir o polimorfismo de tempo de execução.

A função virtual pura pode ser definida como:

 virtual void display() = 0; 

Vejamos um exemplo simples:

palavra-chave java volátil
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

No exemplo acima, a classe base contém a função virtual pura. Portanto, a classe base é uma classe base abstrata. Não podemos criar o objeto da classe base.