Это два разных понятия, которые связаны с использованием функций и методов в классах. Они позволяют обеспечить гибкость и расширяемость кода.
Перегрузка функций или методов позволяет создавать несколько функций с одним и тем же именем, но с разными параметрами (типами и/или количеством). Перегруженные функции могут быть как обычными функциями, так и методами класса.
#include <iostream>
// Перегруженные функции для сложения двух чисел разных типов
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
std::cout << add(3, 4) << std::endl; // Вызов int add(int, int)
std::cout << add(3.5, 4.5) << std::endl; // Вызов double add(double, double)
return 0;
}
Перегрузки методов класса
#include <iostream>
class Print {
public:
void display(int i) {
std::cout << "Integer: " << i << std::endl;
}
void display(double f) {
std::cout << "Double: " << f << std::endl;
}
void display(const std::string& s) {
std::cout << "String: " << s << std::endl;
}
};
int main() {
Print printer;
printer.display(5); // Вызов display(int)
printer.display(3.14); // Вызов display(double)
printer.display("Hello"); // Вызов display(std::string)
return 0;
}
Переопределение происходит, когда метод базового класса определяется повторно в производном классе с той же сигнатурой (именем и параметрами). Это позволяет производному классу предоставлять свою собственную реализацию метода, которая заменяет реализацию базового класса при вызове метода через объект производного класса.
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class show function" << std::endl;
}
virtual ~Base() = default; // Виртуальный деструктор для правильного удаления производных объектов
};
class Derived : public Base {
public:
void show() override { // Переопределение метода show()
std::cout << "Derived class show function" << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
basePtr->show(); // Вызов метода show() из класса Derived
delete basePtr;
return 0;
}
Одна и та же функция имеет несколько вариантов с разными параметрами.
Реализуется в одном и том же классе (или в глобальной области).
Не требует использования ключевого слова
virtual
.Метод базового класса определяется повторно в производном классе с той же сигнатурой.
Используется в иерархии классов.
Требует использования ключевого слова
virtual
в базовом классе и может использовать override
в производном классе для явного указания переопределения.Ставь 👍 и забирай 📚 Базу знаний