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 |