🤔 Что такое перегрузка и переопределение в С++?



Это два разных понятия, которые связаны с использованием функций и методов в классах. Они позволяют обеспечить гибкость и расширяемость кода.



🚩Перегрузка (Overloading)



Перегрузка функций или методов позволяет создавать несколько функций с одним и тем же именем, но с разными параметрами (типами и/или количеством). Перегруженные функции могут быть как обычными функциями, так и методами класса.

#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;

}




🚩Переопределение (Overriding)



Переопределение происходит, когда метод базового класса определяется повторно в производном классе с той же сигнатурой (именем и параметрами). Это позволяет производному классу предоставлять свою собственную реализацию метода, которая заменяет реализацию базового класса при вызове метода через объект производного класса.

#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 в производном классе для явного указания переопределения.



Ставь 👍 и забирай 📚 Базу знаний