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
- 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.