О, классика базовых вопросов по ООП

Давай разберём всё максимально просто, на понятных примерах:
### 1. Инкапсуляция
Это когда ты «упаковываешь» данные и методы (функции) внутрь класса, и прячешь внутреннюю кухню от других частей программы. Типа, у тебя есть пульт от телика — ты можешь нажать кнопку, а вот как там внутри оно работает — знать не нужно.
В C++ это делается через
private и
public:
public — можно трогать снаружи
private — видно только внутри класса
class Radio {
private:
int volume; // скрыто
public:
void setVolume(int v) { volume = v; } // управляешь через функцию
};
### 2. Наследование
Это когда берётся базовый класс и на его основе создаются новые, у которых есть всё от родителя + свои фишки.
Пример: есть класс
Animal. От него наследуем
Dog,
Cat и т.д.
class Animal {
public:
void eat() { /* общий для всех животных */ }
};
class Dog : public Animal {
public:
void bark() { /* только собака */ }
};
Теперь
Dog умеет и
eat(), и
bark().
### 3. Полиморфизм
Это когда один и тот же код работает с разными типами объектов по-своему. Пример с животными: вызываешь у всех
makeSound(), но собака лает, кошка мяукает, а корова мычит.
В C++ для этого как раз нужны
виртуальные функции:
class Animal {
public:
virtual void makeSound() { cout << "Some sound"; }
};
class Dog : public Animal {
public:
void makeSound() override { cout << "Woof!"; }
};
Теперь если у тебя массив из
Animal*, можно вызывать
makeSound() и C++ сам разрулит, кто что скажет.
---
### Виртуальные функции vs обычные
- Обычные: вызываются всегда из типа указателя/ссылки, а не конкретного объекта. Например, если у тебя
Animal*, вызовется метод из Animal, даже если реально это Dog.
- Виртуальные: позволяет динамически определить, какой метод позвать (этот механизм как раз и нужен для полиморфизма!)
Animal* a = new Dog;
a->makeSound(); // если функция виртуальная, то "Woof!", иначе — "Some sound"
---
### Фишка с «объединением данных»
Это как раз инкапсуляция, твой друг прав! Это и упаковка данных, и логики работы с ними в одном месте (классе), чтобы меньше путаться и не лезть туда руками прямо.
---
В общем, ООП = чтобы было удобно и понятно строить большие программы. Без всей этой магии писать что-то сложнее тетриса — боль, а с ней всё как лего собирается
Если что-то всё равно осталось мутно — спрашивай, могу ещё примеров накидать!