Sobes.tech
Junior

Czym są przeciążanie i nadpisywanie metod w C++?

sobes.tech AI

Odpowiedź od AI

Przeciążanie metod (Method Overloading):

  • Pozwala mieć kilka metod o tej samej nazwie w jednej klasie.
  • Różnią się one sygnaturą (liczbą i/lub typami parametrów).
  • Typ zwracany nie bierze udział w definicji sygnatury dla przeciążania.
  • Wybór konkretnej metody jest określany przez kompilator na podstawie typów argumentów podczas wywołania (wiązanie statyczne).
class MyClass {
public:
    void print(int a) {
        // Wypisanie liczby całkowitej
    }

    void print(double d) {
        // Wypisanie liczby zmiennoprzecinkowej
    }

    void print(int a, int b) {
        // Wypisanie dwóch liczb całkowitych
    }
};

Przeciążanie metod (Method Overriding):

  • Pozwala klasie dziedziczącej na dostarczenie specyficznej implementacji metody, która już jest zdefiniowana w klasie bazowej.
  • Metoda w klasie dziedziczącej musi mieć taką samą sygnaturę (nazwa, liczba i typy parametrów) i ten sam typ zwracany (lub typ zwracany kowariantny).
  • Używa się jej z funkcjami wirtualnymi (virtual) do realizacji polimorfizmu.
  • Wybór konkretnej implementacji metody jest ustalany w czasie wykonywania (wiązanie dynamiczne), w zależności od rzeczywistego typu obiektu.
class Base {
public:
    virtual void display() {
        // Implementacja w klasie bazowej
    }
};

class Derived : public Base {
public:
    void display() override { // Słowo kluczowe override (od C++11) pomaga unikać błędów
        // Specyficzna implementacja w klasie dziedziczącej
    }
};

Główne różnice:

Cecha Przeciążanie metod Przesłanianie metod
Miejsce zastosowania W jednej klasie W klasach bazowych i pochodnych
Nazwa metody Taka sama Taka sama
Sygnatura metody Różna Taka sama
Mechanizm wyboru Statyczne wiązanie (kompilacja) Dynamiczne wiązanie (wywołanie)
Używane z Funkcjami zwykłymi Funkcjami wirtualnymi
Cel Różne działania dla różnych typów Specyficzna implementacja w dziedziczeniu