Wykres porównania
Podstawa do porównania | Dziedzictwo | Wielopostaciowość |
---|---|---|
Podstawowy | Dziedziczenie polega na tworzeniu nowej klasy przy użyciu właściwości już istniejącej klasy. | Polimorfizm jest w zasadzie wspólnym interfejsem dla wielu form. |
Realizacja | Dziedziczenie jest w zasadzie realizowane na klasach. | Polimorfizm jest zasadniczo realizowany na podstawie funkcji / metod. |
Posługiwać się | Aby wspierać koncepcję ponownego użycia w OOP i zmniejsza długość kodu. | Pozwala obiektowi decydować, która forma funkcji ma być wywołana, gdy w czasie kompilacji (przeciążenie) oraz w czasie wykonywania (przesłonięcie). |
Formularze | Dziedziczenie może być pojedynczym dziedziczeniem, wielokrotnym dziedziczeniem, wielopoziomowym dziedziczeniem, dziedziczeniem hierarchicznym i dziedziczeniem hybrydowym. | Polimorfizm może być polimorfizmem czasu kompilacji (przeciążeniem) lub polimorfizmem czasu wykonywania (przesłonięcie). |
Przykład | "Tabela" klasy może dziedziczyć cechę "mebli" klasowych, ponieważ "stół" to "meble". | Klasa "study_table" może również mieć funkcję "set_color ()", a klasa "Dining_table" może również posiadać funkcję "set_color ()", więc która postać wywołania funkcji set_color () może zostać ustalona zarówno w czasie kompilacji, jak i czas pracy. |
Definicja dziedziczenia:
Dziedziczenie jest jedną z kluczowych cech OOP, która silnie wspiera "ponowne wykorzystanie". Ponowne użycie można opisać jako tworzenie nowej klasy przez ponowne wykorzystanie właściwości istniejącej klasy. W dziedziczeniu istnieje klasa bazowa, która jest dziedziczona przez klasę pochodną. Gdy klasa dziedziczy dowolną inną klasę, element (y) klasy bazowej staje się członkiem (klasami) klasy pochodnej.
Ogólna forma dziedziczenia klasy jest następująca:
class-pochodna-nazwa-klasy: access-specifier base-class-name {// body klasy};
W tym przypadku specyfikator dostępu udostępnia tryb dostępu (prywatny, publiczny, chroniony) do elementów członkowskich w klasie bazowej do klasy pochodnej. Jeśli nie istnieje specyfikator dostępu, domyślnie jest on uznawany za "prywatny". W C ++, jeśli klasa pochodna jest "struct", wówczas specyfikator dostępu jest domyślnie "public".
W języku C ++ dziedziczenie można osiągnąć w pięciu formach. Można je sklasyfikować jako:
- Pojedyncze dziedziczenie (tylko jedna super klasa)
- Wiele dziedziczenia (kilka klas nadrzędnych)
- Hierarchiczna dziedziczenie (jedna super klasa, wiele podklas)
- Dziedziczenie wielokrotne (wyprowadzone z klasy pochodnej)
W języku Java klasa dziedziczy drugą klasę za pomocą słowa kluczowego "extends". W języku Java klasa bazowa jest określana jako super klasa, a klasa pochodna jest określana jako podklasa. Podklasa nie może uzyskać dostępu do tych elementów klasy podstawowej, które są zadeklarowane jako "prywatne". Ogólna forma dziedziczenia klasy w Javie jest następująca.
klasa pochodna klasy nazwa rozszerza base-class-name {// body klasy};
Java nie obsługuje dziedziczenia dziedziczenia wielokrotnego, natomiast obsługuje wielopoziomową hierarchię. W Javie czasami super-klasa może chcieć ukryć szczegóły implementacji, a niektóre z tych danych są "prywatne". Podobnie jak w Javie, podklasa nie może uzyskać dostępu do prywatnych członków nadklasy i jeśli podklasa chce uzyskać dostęp do tych członków lub je zainicjować, wówczas Java dostarcza rozwiązanie. Podklasa może odnosić członków jej 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. Pierwszym z nich jest wywołanie konstruktora super klasy. Drugi to dostęp do członka superklasy, która została ukryta przez członka podklasy.
// pierwsza forma wywołania konstruktora. class supper_class {supper_class (argument_list) {..} // konstruktor superklasy}; class sub_class extends supper_class {sub_class (argument_list) {..} // konstruktor sub_class super (lista_argumentów); // sub_class wywołuje konstruktor superklasy}};
// sekunda dla klasy "super" supper_class {int i; } class sub_class extends_class {int i; sub_class (int a, int b) {super.i = a; // "i" super klasy i = b; // "i" z klasy podrzędnej}};
Definicja polimorfizmu
Termin polimorfizm oznacza po prostu "jedną funkcję, wiele form". Polimorfizm osiąga się zarówno w czasie kompilacji, jak iw czasie wykonywania. Polimorfizm czasu kompilacji osiąga się przez "przeciążenie", podczas gdy polimorfizm czasu działania osiąga się przez "nadpisywanie".
Polimorfizm pozwala obiektowi zdecydować "która postać funkcji ma być wywołana, gdy" zarówno w czasie kompilacji, jak i czasu działania.
Omówmy pierwszą koncepcję przeciążania. Przy przeciążaniu definiujemy funkcję w klasie więcej niż jeden raz przy różnych typach danych i liczbie parametrów, podczas gdy funkcja, która ma być przeciążona, musi mieć ten sam typ zwracania. Najczęściej funkcje przeciążone są konstruktorami klasy.
przeciążenie klasy {int a, b; public: int overload (int x) {// pierwszy konstruktor overload () a = x; return a; } int overload (int x, int y) {// drugi konstruktor przeciążenia () a = x; b = y; return a * b; }}; int main () {przeciążenie O1; O1.załadowanie (20); // pierwsze wywołanie konstruktora overload () O1.overload (20, 40); // drugie wywołanie konstruktora overload ()}
Omówmy teraz drugą formę polimorfizmu, tj. Przesłonięcie. Koncepcja nadrzędności może być zastosowana wyłącznie do funkcji klas, które również implementują koncepcję dziedziczenia. W C ++ funkcja, która ma zostać zastąpiona, poprzedzona jest słowem kluczowym "virtual" w klasie bazowej i ponownie zdefiniowana w klasie pochodnej z tym samym prototypem oprócz słowa kluczowego "virtual".
class base {public: virtual void funct () {// funkcja wirtualna klasy cout << "To jest funkcja klasy podstawowej ()"; }}; klasa derived1: public base {public: void funct () {// funkcja wirtualna klasy bazowej na nowo zdefiniowana w klasie pochodnej1Kluczowe różnice między dziedziczeniem a polimorfizmem
- Dziedziczenie tworzy klasę, która wywodzi swoją funkcję z już istniejącej klasy. Z drugiej strony polimorfizm jest interfejsem, który można zdefiniować w wielu formach.
- Dziedziczenie jest implementowane na klasach, natomiast polimorfizm jest implementowany na metodach / funkcjach.
- Ponieważ dziedziczenie pozwala klasie pochodnej używać elementów i metod zdefiniowanych w klasie bazowej, klasa pochodna nie musi definiować tych elementów lub metody ponownie, więc możemy powiedzieć, że zwiększa to powtarzalność kodu, a co za tym idzie, zmniejsza długość kodu . Z drugiej strony, polimorfizm umożliwia obiektowi decydowanie, jaką formę metody chce wywołać zarówno w czasie kompilacji, jak iw czasie wykonywania.
- Dziedziczenie można sklasyfikować jako dziedziczenie pojedyncze, dziedziczenie wielokrotne, dziedziczenie wielopoziomowe, dziedziczenie hierarchiczne i dziedziczenie hybrydowe. Z drugiej strony, polimorfizm jest klasyfikowany jako przeciążający i nadrzędny.
Wniosek:
Dziedziczenie i polimorfizm są pojęciami wzajemnie ze sobą powiązanymi, ponieważ dynamiczny polimorfizm dotyczy klas, które realizują także koncepcję dziedziczenia.