# 12. Основные понятия ООП: инкапсуляция, наследование, полиморфизм.

## Основные понятия ООП

### **Инкапсуляция**

1. **Определение**
   * Инкапсуляция — это процесс сокрытия деталей реализации объекта и предоставления интерфейса для взаимодействия с ним.
2. **Пример**

   * Объекты содержат приватные данные и публичные методы для работы с этими данными.

   ```cpp
   class BankAccount {
   private:
       double balance;
   public:
       void deposit(double amount) {
           balance += amount;
       }
       double getBalance() const {
           return balance;
       }
   };
   ```

### **Наследование**

1. **Определение**
   * Наследование позволяет создавать новый класс на основе существующего, унаследуя его свойства и методы.
2. **Пример**

   * Создание класса `SavingsAccount`, который наследует от `BankAccount`.

   ```cpp
   class BankAccount {
   protected:
       double balance;
   public:
       void deposit(double amount) {
           balance += amount;
       }
       double getBalance() const {
           return balance;
       }
   };

   class SavingsAccount : public BankAccount {
   private:
       double interestRate;
   public:
       void applyInterest() {
           balance += balance * interestRate;
       }
   };
   ```

### **Полиморфизм**

1. **Определение**
   * Полиморфизм позволяет объектам разного типа быть обработанными через один интерфейс.
2. **Пример**

   * Использование виртуальных функций и указателей на базовый класс для вызова переопределенных методов производных классов.

   ```cpp
   class Shape {
   public:
       virtual void draw() const {
           std::cout << "Drawing Shape" << std::endl;
       }
   };

   class Circle : public Shape {
   public:
       void draw() const override {
           std::cout << "Drawing Circle" << std::endl;
       }
   };

   Shape* shape = new Circle();
   shape->draw();  // Вывод: Drawing Circle
   ```

## Понятие объекта

1. **Определение**
   * Объект — это экземпляр класса, который содержит данные и методы для работы с этими данными.
2. **Пример**

   * Создание объекта класса `BankAccount`.

   ```cpp
   BankAccount myAccount;
   myAccount.deposit(100.0);
   std::cout << myAccount.getBalance();  // Вывод: 100.0
   ```

### Категории объектов

1. **Активные объекты**
   * Объекты, которые могут инициировать действия самостоятельно, например, потоки или процессы.
2. **Пассивные объекты**
   * Объекты, которые выполняют действия только по запросу, например, обычные данные или структуры.
3. **Абстрактные объекты**
   * Объекты, которые не имеют конкретной реализации и предназначены для предоставления интерфейса, например, абстрактные классы и интерфейсы.

### Отношения между объектами

1. **Ассоциация**

   * Простое отношение между объектами, которое показывает, что один объект знает о другом.

   ```cpp
   class Person {
   private:
       std::string name;
   public:
       Person(std::string n) : name(n) {}
       std::string getName() const { return name; }
   };

   class Car {
   private:
       Person owner;
   public:
       Car(Person p) : owner(p) {}
       std::string getOwnerName() const { return owner.getName(); }
   };
   ```
2. **Агрегация**

   * "Has-a" отношение, где один объект является частью другого, но может существовать отдельно.

   ```cpp
   class Engine {
   public:
       void start() {
           std::cout << "Engine started" << std::endl;
       }
   };

   class Car {
   private:
       Engine engine;
   public:
       void start() {
           engine.start();
           std::cout << "Car started" << std::endl;
       }
   };
   ```
3. **Композиция**

   * Сильная форма агрегации, где жизнь одного объекта зависит от другого.

   ```cpp
   class Engine {
   public:
       void start() {
           std::cout << "Engine started" << std::endl;
       }
   };

   class Car {
   private:
       Engine* engine;
   public:
       Car() {
           engine = new Engine();
       }
       ~Car() {
           delete engine;
       }
       void start() {
           engine->start();
           std::cout << "Car started" << std::endl;
       }
   };
   ```
4. **Наследование**
   * Отношение "is-a", где один класс является расширением другого.

## Понятие класса

1. **Определение**
   * Класс — это шаблон для создания объектов, который определяет их данные и методы.
2. **Пример**

   * Определение класса `BankAccount`.

   ```cpp
   class BankAccount {
   private:
       double balance;
   public:
       void deposit(double amount) {
           balance += amount;
       }
       double getBalance() const {
           return balance;
       }
   };
   ```

### Отношения между классами

1. **Наследование**
   * Класс может наследовать свойства и методы другого класса.
2. **Агрегация и композиция**
   * Классы могут содержать объекты других классов в качестве своих членов.
3. **Ассоциация**
   * Классы могут иметь ссылки или указатели на объекты других классов.

## Понятие домена

1. **Определение**
   * Домен — это область предметной области, которую охватывает программное обеспечение или система.
2. **Пример**

   * В банковской системе домен может включать учетные записи, транзакции, клиентов и т.д.

   ```cpp
   class Account {
   private:
       std::string accountNumber;
       double balance;
   public:
       Account(std::string number, double initialBalance)
           : accountNumber(number), balance(initialBalance) {}
       // Методы для управления учетной записью
   };
   ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://frogs-organization-2.gitbook.io/oop.-sbornik./12.-osnovnye-ponyatiya-oop-inkapsulyaciya-nasledovanie-polimorfizm..md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
