Różnica między dziedziczeniem a polimorfizmem

Autor: Laura McKinney
Data Utworzenia: 1 Kwiecień 2021
Data Aktualizacji: 15 Móc 2024
Anonim
Różnica między dziedziczeniem a polimorfizmem - Technologia
Różnica między dziedziczeniem a polimorfizmem - Technologia

Zawartość


Dziedziczenie pozwala na wielokrotne użycie kodu, a polimorfizm polega na występowaniu jednej funkcji o innej formie. Podstawowa różnica między dziedziczeniem a polimorfizmem polega na tym, że dziedziczenie pozwala na ponowne użycie już istniejącego kodu w programie, a polimorfizm zapewnia mechanizm do dynamicznego decydowania o formie wywoływanej funkcji.

  1. Wykres porównania
  2. Definicja
  3. Kluczowe różnice
  4. Wniosek

Wykres porównania

Podstawa do porównaniaDziedzictwoWielopostaciowość
PodstawowyDziedziczenie polega na utworzeniu nowej klasy przy użyciu właściwości już istniejącej klasy.Polimorfizm jest w zasadzie powszechnym interfejsem dla wielu form.
RealizacjaDziedziczenie jest zasadniczo realizowane na klasach.Polimorfizm jest zasadniczo implementowany w funkcji / metodach.
Posługiwać sięAby wesprzeć koncepcję wielokrotnego użytku w OOP i skrócić długość kodu.Pozwala obiektowi zdecydować, która forma funkcji ma zostać wywołana, kiedy w czasie kompilacji (przeciążenie), a także w czasie wykonywania (przesłanianie).
FormularzeDziedziczenie może być pojedynczym spadkiem, wielokrotnym spadkiem, spadkiem wielopoziomowym, spadkiem hierarchicznym i spadkiem hybrydowym.Polimorfizm może być polimorfizmem w czasie kompilacji (przeciążanie) lub polimorfizmem w czasie wykonywania (nadpisywanie).
PrzykładStolik klasy może odziedziczyć funkcję mebli klasowych, ponieważ stół jest meblem.Klasa study_table może również mieć funkcję set_color (), a klasa Dining_table może również mieć funkcję set_color (), więc która forma funkcji set_color (), która ma zostać wywołana, może być ustalona zarówno podczas kompilacji, jak i czasu wykonywania.


Definicja dziedziczenia:

Dziedziczenie jest jedną z kluczowych cech OOP, które zdecydowanie wspierają „możliwość ponownego użycia”. Wielokrotnego użytku można opisać jako tworzenie nowej klasy poprzez ponowne użycie właściwości istniejącej klasy. W dziedziczeniu istnieje klasa podstawowa, która jest dziedziczona przez klasę pochodną. Gdy klasa dziedziczy dowolną inną klasę, element (y) klasy bazowej staje się członkiem (ami) klasy pochodnej.

Ogólna forma dziedziczenia klasy jest następująca:

klasa pochodna-nazwa-klasy: specyfikator dostępu base-class-name {// body of the class};

Tutaj specyfikator dostępu zapewnia tryb dostępu (prywatny, publiczny, chroniony) do elementów członkowskich w klasie bazowej do klasy pochodnej. Jeśli nie ma specyfikatora dostępu, domyślnie jest uznawany za „prywatny”. W C ++, jeśli klasą pochodną jest „struct”, to specyfikatorem dostępu jest domyślnie „public”.

W C ++ dziedziczenie można osiągnąć w pięciu formach. Można je sklasyfikować jako:


  • Pojedyncze dziedziczenie (tylko jedna superklasa)
  • Wielokrotne dziedziczenie (kilka nadklas)
  • Dziedziczenie hierarchiczne (jedna superklasa, wiele podklas)
  • Wielokrotne dziedziczenie (wyprowadzone z klasy pochodnej)

W Javie klasa dziedziczy drugą klasę za pomocą słowa kluczowego „extends”. W Javie klasa podstawowa jest nazywana superklasą, a klasa pochodna nazywana jest podklasą. Podklasa nie ma dostępu do tych członków klasy podstawowej, którzy zostali zadeklarowani jako „prywatni”. Ogólna forma dziedziczenia klasy w Javie jest następująca.

klasa pochodna-nazwa-klasy rozszerza base-class-name {// body of the class};

Java nie obsługuje dziedziczenia wielokrotnego dziedziczenia, podczas gdy obsługuje wielopoziomową hierarchię. W Javie czasami superklasa może chcieć ukryć szczegóły swojej implementacji i czyni część tych danych „prywatnymi”. Podobnie jak w Javie, podklasa nie może uzyskać dostępu do prywatnych członków nadklasy, a jeśli podklasa chce uzyskać dostęp lub zainicjować tych członków, Java zapewnia rozwiązanie. Podklasa może odwoływać członków swojej bezpośredniej nadklasy za pomocą słowa kluczowego „super”. Pamiętaj, że możesz uzyskać dostęp tylko do członków bezpośredniej nadklasy.

„Super” ma dwie ogólne formy. Pierwszy polega na wywołaniu konstruktora superklasy. Drugim jest uzyskanie dostępu do członka nadklasy, który został ukryty przez członka podklasy.

// pierwsza forma wywołania konstruktora. class supper_class {supper_class (argument_list) {..} // konstruktor superklasy}; klasa sub_class rozszerza supper_class {sub_class (lista_ argumentów) {..} // konstruktor superklasy pod_klasy (lista_argumentów); // sub_class wywołuje konstruktor superklasy}};

// drugie miejsce dla superklasy supper_class {int i; } klasa sub_class rozszerza supper_class {int i; sub_class (int a, int b) {super.i = a; // i superklasy i = b; // i podklasy}};

Definicja polimorfizmu

Termin polimorfizm oznacza po prostu „jedna funkcja, wiele form”. Polimorfizm osiąga się zarówno w czasie kompilacji, jak i w czasie wykonywania. Polimorfizm w czasie kompilacji osiąga się poprzez „przeciążenie”, natomiast polimorfizm w czasie wykonywania osiąga się przez „nadpisywanie”.

Polimorfizm pozwala obiektowi decydować „, która forma funkcji ma zostać wywołana, kiedy” zarówno w czasie kompilacji, jak i w czasie wykonywania.
Omówmy pierwszą koncepcję przeciążenia. W przypadku przeciążenia definiujemy funkcję w klasie więcej niż jeden raz z innym typem danych i liczbą parametrów, podczas gdy funkcja do przeciążenia musi mieć ten sam typ zwracany. W większości przypadków funkcje przeciążonego są konstruktorami klasy.

przeciążenie klasy {int a, b; public: int overload (int x) {// pierwszy konstruktor overload () a = x; zwrócić a; } int overload (int x, int y) {// drugi konstruktor overload () a = x; b = y; zwraca a * b; }}; int main () {przeciążenie O1; O1. Przeciążenie (20); // pierwsze wywołanie konstruktora overload () O1.overload (20,40); // drugie wywołanie konstruktora overload ()}

Omówmy teraz drugą formę polimorfizmu, czyli nadpisywanie. Pojęcie nadpisania może być zaimplementowane tylko do funkcji klas, które również implementują pojęcie dziedziczenia. W C ++ funkcja do zastąpienia jest poprzedzona słowem kluczowym „virtual” w klasie bazowej i przedefiniowana w klasie pochodnej za pomocą tego samego prototypu, z wyjątkiem słowa kluczowego „virtual”.

class base {public: virtual void FUN () {// wirtualna funkcja klasy podstawowej cout << "To jest funkcja klasy podstawowej ()"; }}; klasa pochodna1: podstawa publiczna {public: void funk () {// funkcja wirtualna klasy bazowej zdefiniowana w pochodnej1 klasa cout << "To jest funkcja pochodna1 klasy ()"; }}; int main () {base * p, b; wyprowadzony 1 d1; * p = & b; p-> funk (); // wywołanie funkcji bazowej FUN (). * p = & d1; zwraca 0; }

  1. Dziedziczenie tworzy klasę, która wywodzi swoją cechę z już istniejącej klasy. Z drugiej strony polimorfizm jest interfejsem, który można zdefiniować w wielu formach.
  2. Dziedziczenie jest realizowane na klasach, natomiast polimorfizm jest implementowany na metodach / funkcjach.
  3. Ponieważ dziedziczenie pozwala klasie pochodnej na użycie elementów i metod zdefiniowanych w klasie bazowej, klasa pochodna nie musi ponownie definiować tych elementów ani metod, więc możemy powiedzieć, że zwiększa ona możliwość ponownego użycia kodu, a tym samym zmniejsza długość kodu . Z drugiej strony polimorfizm pozwala obiektowi decydować, jaką formę metody chce wywołać zarówno w czasie kompilacji, jak i w czasie wykonywania.
  4. Dziedziczenie można sklasyfikować jako dziedziczenie pojedyncze, wielokrotne, wielopoziomowe, hierarchiczne i hybrydowe. Z drugiej strony polimorfizm jest klasyfikowany jako przeciążanie i nadpisywanie.

Wniosek:

Dziedziczenie i polimorfizm są pojęciami wzajemnie powiązanymi, ponieważ dynamiczny polimorfizm dotyczy klas, które również realizują koncepcję dziedziczenia.