O que se entende por polimorfismo em C?


Melhor resposta

Na verdade, não há conceito de polimorfismo em C. O polimorfismo é uma propriedade da Programação Orientada a Objetos. Uma vez que C não é um OOP, C não tem nenhum conceito de polimorfismo. Considerando que C ++ tem, visto que é uma linguagem de Programação Orientada a Objetos (não completamente).

Polimorfismo significa ter muitas formas. Existem principalmente dois tipos de polimorfismo em C ++:

  • Polimorfismo de tempo de compilação
  • Polimorfismo de tempo de execução
    1. Polimorfismo de tempo de compilação : este tipo de polimorfismo é obtido por sobrecarga de função ou sobrecarga de operador.
  • Sobrecarga de função : Quando há várias funções com o mesmo nome, mas parâmetros diferentes, essas funções são consideradas sobrecarregadas . As funções podem ser sobrecarregadas por alteração no número de argumentos ou / e alteração no tipo de argumentos .

#include

using namespace std;

class Geeks

{

public:

// function with 1 int parameter

void func(int x)

{

cout << "value of x is " << x << endl;

}

// function with same name but 1 double parameter

void func(double x)

{

cout << "value of x is " << x << endl;

}

// function with same name and 2 int parameters

void func(int x, int y)

{

cout << "value of x and y is " << x << ", " << y << endl;

}

};

int main() {

Geeks obj1;

// The first "func" is called

obj1.func(7);

// The second "func" is called

obj1.func(9.132);

// The third "func" is called

obj1.func(85,64);

return 0;

}

  • Sobrecarga do operador: C ++ também fornece opção para sobrecarregar os operadores. Por exemplo, podemos fazer o operador (‘+’) para a classe string para concatenar duas strings. Sabemos que este é o operador de adição cuja tarefa é somar operandos. Portanto, um único operador + quando colocado entre operandos inteiros, adiciona-os e, quando colocado entre operandos string, concatena-os.

#include

using namespace std;

class Complex {

private:

int real, imag;

public:

Complex(int r = 0, int i =0) {real = r; imag = i;}

// This is automatically called when "+" is used with

// between two Complex objects

Complex operator + (Complex const &obj) {

Complex res;

res.real = real + obj.real;

res.imag = imag + obj.imag;

return res;

}

void print() { cout << real << " + i" << imag << endl; }

};

int main()

{

Complex c1(10, 5), c2(2, 4);

Complex c3 = c1 + c2; // An example call to "operator+"

c3.print();

}

2. Polimorfismo de tempo de execução: : este tipo de polimorfismo é obtido por substituição de função.

  • Substituição de função: por outro lado, ocorre quando uma classe derivada tem uma definição para uma das funções de membro da classe base. Essa função básica é considerada substituída.

#include

using namespace std;

// Base class

class Parent

{

public:

void print()

{

cout << "The Parent print function was called" << endl;

}

};

// Derived class

class Child : public Parent

{

public:

// definition of a member function already present in Parent

void print()

{

cout << "The child print function was called" << endl;

}

};

//main function

int main()

{

//object of parent class

Parent obj1;

//object of child class

Child obj2 = Child();

// obj1 will call the print function in Parent

obj1.print();

// obj2 will override the print function in Parent

// and call the print function in Child

obj2.print();

return 0;

}

Resposta

Porque essa é a definição de polimorfismo: o código não Não sei até o tempo de execução qual é a classe real de algum objeto.

Usando um exemplo tradicional, vamos considerar uma classe base Shape com um método draw (). Forma tem duas subclasses: Círculo e Quadrado, que substituem draw () para - você adivinhou - desenhar um círculo e um quadrado, respectivamente.

Agora, o aplicativo permite que o usuário crie várias formas. E a função de atualização da visualização itera sobre eles e chama:

currentShape.draw ()

o compilador não tem como saber em tempo de compilação se currentShape será um quadrado ou um círculo e assim, qual implementação draw () chamar. A decisão deve ser tomada em tempo de execução.

Concedido, há casos em que o compilador * pode * inferir a classe real de um objeto. Nesse caso, ele possivelmente otimizará a pesquisa de tempo de execução.

Observe que o polimorfismo e este tempo de execução despacham para a implementação correta de uma função, dependendo do tipo de dados real de um (ou mais) de seus argumentos é muito útil e poderoso.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *