Junior
Kas yra metodų perkrovimas ir perrašymas C++-e?
sobes.tech AI
Atsakymas iš AI
Metodų perkrovimas (Method Overloading):
- Leidžia turėti kelis metodus su tuo pačiu pavadinimu viename klasėje.
- Skiriasi pagal signatūrą (parametrų kiekį ir/ar tipus).
- Grąžinamoji rūšis neįeina į signatūros apibrėžimą perkrovimui.
- Konkretus metodas pasirenkamas kompiliatoriaus pagal argumentų tipus iškvietimo metu (statinis susiejimas).
class MyClass {
public:
void print(int a) {
// Spausdinti sveikąjį skaičių
}
void print(double d) {
// Spausdinti slankųjį skaičių
}
void print(int a, int b) {
// Spausdinti du sveikuosius skaičius
}
};
Metodų perkrovimas (Method Overloading):
- Leidžia paveldėti klasei pateikti specifinę metodo realizaciją, kuri jau apibrėžta bazinėje klasėje.
- Paveldėtoje klasėje metodas turi turėti tą pačią signatūrą (vardą, parametrų skaičių ir tipus) ir tą patį grąžinimo tipą (ar kovariantinį tipą).
- Naudojama su virtualiomis funkcijomis (
virtual) polimorfizmui įgyvendinti. - Konkretus realizavimas pasirenkamas vykdymo metu (dinaminis susiejimas), priklausomai nuo objekto tikrojo tipo.
class Base {
public:
virtual void display() {
// Bazinės klasės realizacija
}
};
class Derived : public Base {
public:
void display() override { // `override` žodis (nuo C++11) padeda išvengti klaidų
// Konkretus realizavimas paveldėjimo klasėje
}
};
Pagrindiniai skirtumai:
| Savybė | Metodų perkrovimas | Metodų perrašymas |
|---|---|---|
| Taikymo vieta | Vienoje klasėje | Bazinėje ir paveldėtose klasėse |
| Metodo pavadinimas | Tas pats | Tas pats |
| Signatūra | Skirtinga | Tas pati |
| Pasirinkimo mechanizmas | Statinis susiejimas (kompiliacija) | Dinaminis susiejimas (vykdymas) |
| Naudojama su | Paprastomis funkcijomis | Viritualinėmis funkcijomis |
| Tikslas | Skirtingos veiklos skirtingų tipų atžvilgiu | Konkretus įgyvendinimas paveldėjimo metu |