Różnica między przeciążaniem funkcji a nadpisywaniem w C ++

Autor: Laura McKinney
Data Utworzenia: 1 Kwiecień 2021
Data Aktualizacji: 10 Móc 2024
Anonim
Różnica między przeciążaniem funkcji a nadpisywaniem w C ++ - Technologia
Różnica między przeciążaniem funkcji a nadpisywaniem w C ++ - Technologia

Zawartość


W 'przeciążenie„Redefiniujemy przeciążone funkcje o tej samej nazwie, ale innej liczbie i typie parametrów. W 'nadrzędny„Prototyp zastąpionej funkcji jest taki sam w całym programie, ale funkcja, która ma zostać zastąpiona, jest poprzedzona słowem kluczowym„ virtual ”w klasie podstawowej i jest redefiniowana przez klasę pochodną bez żadnego słowa kluczowego.

Polimorfizm jest jedną z kluczowych cech OOP. Oznacza to po prostu „używanie jednej nazwy dla wielu formularzy”. Polimorfizm można zaimplementować za pomocą „przeciążenia funkcji”, „przeciążenia operatora” i „funkcji wirtualnej”. Zarówno „przeciążanie”, jak i „zastępowanie” implikuje pojęcie polimorfizmu. Tutaj „przeciążenie” oznacza polimorfizm w czasie kompilacji, a „nadpisanie” to polimorfizm w czasie wykonywania. Studiując dalej, jeśli mówimy o głównej różnicy w „przeciążaniu” i „zastępowaniu”.

Ponadto badamy różnicę między przeciążeniem a zastąpieniem za pomocą tabeli porównawczej.


  1. Wykres porównania
  2. Definicja
  3. Kluczowe różnice
  4. Podobieństwa
  5. Wniosek


Wykres porównania:

Podstawa do porównaniaPrzeciążenieNadrzędny
PrototypPrototyp różni się, ponieważ liczba lub typ parametru może się różnić.Wszystkie aspekty prototypu muszą być takie same.
Słowo kluczowePodczas przeładowywania nie zastosowano słowa kluczowego.Funkcja, która ma zostać zastąpiona, poprzedzona jest słowem kluczowym virtual w klasie bazowej.
Czynnik wyróżniającyLiczba lub typ parametru różni się, co decyduje o wywołaniu wersji funkcji.Która funkcja klas jest wywoływana przez wskaźnik, zależy od adresu, który obiekt klas jest przypisany do tego wskaźnika.
Definiowanie wzoruFunkcje zostały przedefiniowane pod tą samą nazwą, ale inną liczbą i typem parametru.Funkcja jest zdefiniowana, poprzedzona słowem kluczowym wirtualnym w klasie głównej i przedefiniowana przez klasę pochodną bez słowa kluczowego out.
Czas realizacjiCzas kompilacji.Czas pracy
Funkcja konstruktora / wirtualnaKonstruktory mogą być przeciążone.Funkcję wirtualną można zastąpić.
Burzyciel
Niszczyciel nie może być przeciążony.Niszczyciel może zostać zastąpiony.
WiążącyPrzeciążenie powoduje wczesne wiązanie.Przesłanianie odnosi się do późnego wiązania.


Definicja przeciążenia

Polimorfizm w czasie kompilacji nazywa się „przeciążeniem”. Ponieważ przeciążenie powstaje na podstawie koncepcji polimorfizmu, zapewnia on „wspólny interfejs dla wielu metod”. Oznacza to, że jeśli funkcja jest przeciążona, zawiera tę samą nazwę podczas redefiniowania.

Funkcje przeciążone różnią się pod względem różnych „liczby lub rodzaju parametrów”, co odróżnia jedną funkcję przeciążoną od drugiej. W ten sposób kompilator rozpoznaje, która funkcja przeciążona jest wywoływana. Najczęściej przeciążonymi funkcjami są „konstruktory”. „Konstruktor kopii” jest rodzajem „przeciążenia konstruktora”.

Implementacja przeciążenia w C ++

przeciążenie klasy {int a, b; public: int load (int x) {// pierwsza funkcja load () a = x; zwrócić a; } int load (int x, int y) {// druga funkcja load () a = x; b = y; zwraca a * b; }}; int main () {przeciążenie O1; O1.load (20); // pierwsze wywołanie funkcji load () O1.load (20,40); // drugie wywołanie funkcji load ()}

Tutaj funkcja load () przeciążenia klasy została przeciążona. Dwie przeciążone funkcje klasy można rozróżnić w taki sposób, że pierwsza funkcja load () akceptuje tylko jeden parametr liczby całkowitej, podczas gdy druga funkcja load () akceptuje dwa parametry liczby całkowitej. Gdy obiekt przeciążenia klasy wywołuje funkcję load () z jednym parametrem, wywoływana jest pierwsza funkcja load (). Gdy obiekt wywołuje funkcję load () mającą dwa parametry, wywoływana jest druga funkcja load ().

Definicja zastąpienia

Polimorfizm osiągnięty w czasie wykonywania nazywa się „nadpisywaniem”. Można to osiągnąć za pomocą „dziedziczenia” i „funkcji wirtualnych”. Zastępowana funkcja jest poprzedzona słowem kluczowym „wirtualny” w klasie bazowej i przedefiniowana w klasie pochodnej bez żadnego słowa kluczowego.

Jedną z najważniejszych rzeczy do zapamiętania w przypadku przesłonięcia jest to, że prototyp przesłoniętej funkcji nie może ulec zmianie, podczas gdy klasa pochodna ją przedefiniowuje. Kiedy nadpisana funkcja otrzyma wywołanie, C ++ określa, która wersja funkcji jest wywoływana na podstawie „typu obiektu wskazywanego przez wskaźnik”, za pomocą którego wywoływana jest funkcja.

Implementacja przesłonięcia w C ++

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 ()"; }}; klasa pochodna2: publiczna baza {public: void FUN () {// funkcja wirtualna klasy bazowej zdefiniowana w pochodnej 2 klasa cout << "To jest funkcja pochodna2 klasy ()"; }}; int main () {base * p, b; wyprowadzony 1 d1; wyprowadzony2 d2; * p = & b; p-> funk (); // wywołanie funkcji bazowej FUN (). * p = & d1; p-> funk (); // wywołanie funkcji pochodnej1 funkcji (). * p = & d2; p-> funk (); // wywołanie funkcji pochodnej2 klasy FUN (). zwraca 0; }

Tutaj istnieje jedna klasa bazowa, która jest publicznie dziedziczona przez dwie klasy pochodne. Funkcja wirtualna jest zdefiniowana w klasie bazowej ze słowem kluczowym „virtual” i jest redefiniowana przez obie klasy pochodne bez słowa kluczowego. W main () klasa podstawowa tworzy zmienną wskaźnikową „p” i obiekt „b”; „Klasa pochodna1” tworzy obiekt d1, a klasa pochodna2 tworzy obiekt d2 ”.

Teraz początkowo adres obiektu klasy bazowej „b” jest przypisany do wskaźnika klasy bazowej „p”. „P” wywołuje funkcję funk (), więc wywoływana jest funkcja klasy bazowej.Następnie adres wskaźnika klasy pochodnej „d1” jest przypisywany do wskaźnika „p”, ponownie wywołuje funkcję fun (); tutaj wykonywana jest funkcja funk () klasy pochodnej1. Na koniec wskaźnik „p” jest przypisany do obiektu klasy pochodnej2. Następnie „p” wywołuje funkcję funk (), która wykonuje funkcję funk () klasy pochodnej 2.

Gdyby klasa pochodna1 / pochodna2 nie zdefiniowała na nowo funkcji (), wówczas wywołana byłaby funkcja () klasy podstawowej, ponieważ funkcje wirtualne są „hierarchiczne”.

  1. Prototyp przeciążonej funkcji różni się ze względu na rodzaj i liczbę parametrów przekazywanych do przeciążonej funkcji. Z drugiej strony prototyp funkcji przesłoniętej nie zmienia się, ponieważ przesłonięta funkcja wykonuje inną akcję dla innej klasy, do której należy, ale z tym samym typem i liczbą parametrów.
  2. Nazwa przeciążonej funkcji nie poprzedza żadnym słowem kluczowym, natomiast nazwa zastąpionej funkcji poprzedza ją słowem kluczowym „Wirtualny” tylko w klasie podstawowej.
  3. To, która funkcja przeciążona zostanie wywołana, zależy od typu lub liczby parametrów przekazanych do funkcji. Zastąpiona funkcja, która jest wywoływana, zależy od tego, który adres obiektu klasy jest przypisany do wskaźnika, który wywołał funkcję.
  4. Która funkcja przeciążenia ma zostać wywołana, jest rozwiązywana podczas kompilacji. Która przesłonięta funkcja, która ma zostać wywołana, jest rozwiązywana podczas działania.
  5. Konstruktory mogą być przeciążone, ale nie można ich zastąpić.
  6. Niszczyciele nie mogą być przeciążone, ale mogą zostać zastąpione.
  7. Przeciążenie powoduje wczesne powiązanie, ponieważ funkcja, która zostanie wywołana, zostanie rozwiązana podczas kompilacji. Przesłanianie powoduje późne wiązanie, ponieważ funkcja, która zostanie zastąpiona, zostanie wywołana, zostanie rozwiązana podczas działania.

Podobieństwa

  1. Oba są stosowane do funkcji składowych klasy.
  2. Polimorfizm jest podstawową koncepcją obu z nich.
  3. Nazwa funkcji pozostaje taka sama, gdy do funkcji stosujemy przeciążanie i zastępowanie.

Wniosek

Przeładowanie i zastąpienie wydaje się podobne, ale tak nie jest. Funkcje mogą być przeciążone, ale żadna klasa nie może ponownie zdefiniować przeciążonej funkcji w przyszłości. Funkcja wirtualna nie może być przeciążona; można je tylko zastąpić.