Ответ
Плюсы ООП в контексте C++:
- Инкапсуляция: Объединение данных (полей) и методов, которые с ними работают, в класс. Сокрытие внутренней реализации через спецификаторы доступа (
private/protected). Это уменьшает coupling и защищает инварианты класса. - Наследование: Возможность создавать новые классы на основе существующих, переиспользуя и расширяя их функциональность. В C++ поддерживается множественное наследование.
- Полиморфизм: Возможность объектов производных классов обрабатываться через интерфейс базового класса с помощью виртуальных функций и динамического связывания. Это основа для проектирования гибких, расширяемых систем.
- Абстракция: Моделирование сложных систем через классы, которые представляют ключевые концепции предметной области, скрывая ненужные детали.
Минусы и сложности ООП, особенно в C++:
- Накладные расходы: Использование виртуальных функций влечёт за собой косвенный вызов через vtable и потерю некоторых оптимизаций (например, инлайнинга). Наследование может увеличить размер объектов.
- Сложность иерархий: Глубокие или излишне сложные цепочки наследования (особенно множественного) делают код трудным для понимания, сопровождения и отладки (проблема "ромбовидного" наследования).
- Жёсткая связность (tight coupling): Наследование создаёт сильную зависимость между базовым и производным классом. Изменения в базовом классе могут сломать работу всех наследников.
- Не всегда подходит для задач: ООП — не серебряная пуля. Для некоторых задач (например, математические вычисления, системное программирование) более подходящими могут быть процедурный, функциональный или generic подход (шаблоны C++).
Пример полиморфизма в C++:
#include <iostream>
#include <memory>
#include <vector>
class Shape {
public:
virtual ~Shape() = default; // Виртуальный деструктор обязателен!
virtual double area() const = 0; // Чисто виртуальная функция
};
class Circle : public Shape {
double radius;
public:
explicit Circle(double r) : radius(r) {}
double area() const override { return 3.14159 * radius * radius; }
};
class Rectangle : public Shape {
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() const override { return width * height; }
};
int main() {
std::vector<std::unique_ptr<Shape>> shapes;
shapes.push_back(std::make_unique<Circle>(5.0));
shapes.push_back(std::make_unique<Rectangle>(4.0, 6.0));
// Полиморфный вызов - код работает с интерфейсом Shape
for (const auto& shape : shapes) {
std::cout << "Area: " << shape->area() << 'n';
}
return 0;
} Видео-ответы
▶
Как пройти собеседование на Java-разработчика: разбор вопросов и задачи с ментором из финтех
▶
Моковое собеседование на Middle Python-разработчика | Solvery & Moscow Python
▶
Групповое собеседование на Junior и Middle Java разработчика
▶
Собеседование Junior C++
▶
Публичное собеседование: iOS-разработчик [Хекслет]