Co oznacza polimorfizm w języku C?


Najlepsza odpowiedź

Właściwie nie ma pojęcia polimorfizmu w C. Polimorfizm jest właściwością programowania obiektowego. Ponieważ C nie jest OOP, C nie ma żadnego pojęcia polimorfizmu. Natomiast C ++ tak, ponieważ jest językiem programowania obiektowego (nie do końca).

Polimorfizm oznacza posiadanie wielu form. Istnieją głównie dwa typy polimorfizmu w C ++:

  • Polimorfizm czasu kompilacji
  • Polimorfizm w czasie wykonywania
    1. Polimorfizm czasu kompilacji : ten typ polimorfizmu uzyskuje się przez przeciążenie funkcji lub operatora.
  • Przeciążanie funkcji : gdy istnieje wiele funkcji o tej samej nazwie, ale różnych parametrach, mówi się, że są one przeciążone . Funkcje można przeciążać przez zmianę liczby argumentów lub / i zmianę typu argumentów .

#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;

}

  • Przeciążanie operatorów: C ++ udostępnia również opcję przeciążania operatorów. Na przykład, możemy sprawić, że operator („+”) dla klasy łańcuchowej będzie łączył dwa ciągi. Wiemy, że jest to operator dodawania, którego zadaniem jest dodawanie do operandów. Tak więc pojedynczy operator „+” umieszczony między operandami całkowitymi dodaje je, a po umieszczeniu między operandami łańcuchowymi łączy je.

#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. Polimorfizm w czasie wykonywania: : ten typ polimorfizmu jest osiągany przez przesłanianie funkcji.

  • Przesłanianie funkcji: z drugiej strony występuje, gdy klasa pochodna ma definicję jednej z funkcji składowych klasy bazowej. Mówi się, że ta funkcja podstawowa jest nadpisana.

#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;

}

Odpowiedź

Ponieważ taka jest definicja polimorfizmu: kod nie Do czasu uruchomienia wiem, jaka jest rzeczywista klasa jakiegoś obiektu.

W tradycyjnym przykładzie rozważmy klasę bazową Shape z metodą draw (). Kształt ma dwie podklasy: Okrąg i Kwadrat, które zastępują funkcję draw (), aby - zgadłeś - narysować odpowiednio okrąg i kwadrat.

Teraz aplikacja pozwala użytkownikowi stworzyć kilka kształtów. Funkcja aktualizacji widoku iteruje po nich i wywołuje:

currentShape.draw ()

kompilator nie ma możliwości dowiedzenia się w czasie kompilacji, czy currentShape będzie kwadratem czy okręgiem i stąd która implementacja draw () ma zostać wywołana. Decyzja musi zostać podjęta w czasie wykonywania.

Oczywiście, są przypadki, w których kompilator * może * wywnioskować faktyczną klasę obiektu. W takim przypadku prawdopodobnie zoptymalizuje wyszukiwanie w czasie wykonywania.

Zauważ, że polimorfizm i ten czas wykonywania kierują do prawidłowej implementacji funkcji w zależności od rzeczywistego typu danych jednego (lub więcej) z jej argumenty są bardzo przydatne i potężne.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *