Primeiro, vamos apresentar nosso novo ponto de conhecimento – função virtual .
Que tipo de função é essa? Simplificando, é uma função declarada com virtual na frente de uma função. A forma geral é a seguinte:
valor de retorno da função virtual nome da função (parâmetro formal) {corpo da função}
Então, para que é usado? O surgimento de funções virtuais permite que a conexão entre a função e o corpo da função seja estabelecida em tempo de execução, que é a chamada ligação dinâmica . Então, quando a classe derivada da função virtual estiver em execução, o efeito de executar o mesmo método, mas com resultados diferentes, pode ser alcançado de acordo com a ligação dinâmica em tempo de execução, que é o chamado polimorfismo. Desta forma, existe uma maneira de resolver o problema da seção anterior.
Em seguida, precisamos apenas declarar o método area na classe base como uma função virtual, e então qualquer ponteiro ou referência do tipo Point na função principal pode ser chamado com ousadia, e não há necessidade de se preocupar com problemas de tipo. Porque eles decidirão qual método chamar com base no tipo de objeto real para obter ligação dinâmica.
O código é o seguinte:
/************************************//Des: demonstração do tutorial C++//Autor: Huang/ /Direitos autorais:www.dotcpp.com//Data:20/12/2017********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
Após a modificação, compile e execute da seguinte forma:
Experimente em seu próprio computador para experimentar o papel das funções virtuais e do polimorfismo.
As coisas a serem observadas são:
1. As funções virtuais não podem ser funções-membro estáticas ou funções amigas porque não pertencem a um objeto.
2. As funções inline não podem determinar dinamicamente sua localização durante o tempo de execução. Mesmo que a função virtual seja definida dentro da classe, ela ainda será considerada não inline durante a compilação.
3. O construtor não pode ser uma função virtual e o destruidor pode ser uma função virtual e geralmente é declarado como uma função virtual.