**Задача 2: Агрегация в библиотеке**
Создайте класс `Book` (книга) с полями `title` и `author`. Создайте класс `Library` (библиотека), который содержит коллекцию книг.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Library library;
    library.addBook(Book("C++ Primer", "Stanley B. Lippman"));
    library.addBook(Book("Effective C++", "Scott Meyers"));

    library.displayBooks();

    return 0;
}
```

#### Пояснение:
- Класс `Library` использует агрегацию, так как книги могут существовать независимо от библиотеки.

---

### **Задача 3: Композиция в компьютере**
Создайте класс `CPU` (процессор) и класс `Computer` (компьютер). Класс `Computer` должен содержать объект класса `CPU` и предоставлять метод для вывода информации о процессоре.

#include <iostream>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Computer myPC("Intel Core i7");
    myPC.displayInfo();

    return 0;
}
```

#### Пояснение:
- Класс `Computer` владеет объектом `CPU`, что является композицией.

---

### **Задача 4: Полиморфизм и наследование**
Создайте базовый класс `Animal` с методом `makeSound()`. Создайте производные классы `Dog` и `Cat`, которые переопределяют этот метод. Используйте полиморфизм для вызова методов.

#include <iostream>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Dog dog;
    Cat cat;

    animalSound(&dog);
    animalSound(&cat);

    return 0;
}
```

#### Пояснение:
- Полиморфизм позволяет вызывать методы производных классов через указатель на базовый класс.

---

### **Задача 5: Наследование и доступ к членам**
Создайте базовый класс `Person` с приватными полями `name` и `age`. Создайте производный класс `Employee`, который добавляет поле `salary` и предоставляет метод для вывода всей информации.

#include <iostream>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Employee emp("John Doe", 30, 50000);
    emp.display();

    return 0;
}
```

#### Пояснение:
- Защищённые поля базового класса (`name`, `age`) доступны в производном классе.

---

### **Задача 6: Агрегация в магазине**
Создайте класс `Product` (товар) и класс `Store` (магазин). Магазин содержит коллекцию товаров.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Store store;
    store.addProduct(Product("Laptop", 1200));
    store.addProduct(Product("Phone", 800));

    store.displayProducts();

    return 0;
}
```

#### Пояснение:
- Товары могут существовать независимо от магазина, что делает это агрегацией.

---

### **Задача 7: Композиция в доме**
Создайте класс `Room` (комната) и класс `House` (дом). Дом содержит несколько комнат.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    House house({"Living Room", "Bedroom", "Kitchen"});
    house.displayRooms();

    return 0;
}
```

#### Пояснение:
- Комнаты не могут существовать без дома, что делает это композицией.

---

#include <iostream>
#include <string>
using namespace std;

// создайте необходимые классы и методы

ostream& operator<<(ostream& os, const Point& point) {
    point.display();
    return os;
}

int main() {
    ColoredPoint cp(3, 4, "Red");
    cout << cp << endl;

    return 0;
}
```

#### Пояснение:
- Оператор `<<` перегружен для работы с базовым и производным классами.

---

### **Задача 9: Агрегация в школе**
Создайте класс `Student` (ученик) и класс `Classroom` (класс). Класс содержит учеников.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Classroom classroom;
    classroom.addStudent(Student("Alice"));
    classroom.addStudent(Student("Bob"));

    classroom.displayStudents();

    return 0;
}
```

#### Пояснение:
- Ученики могут существовать независимо от класса, что делает это агрегацией.

---

### **Задача 10: Композиция в телефоне**
Создайте класс `Battery` (батарея) и класс `Phone` (телефон). Телефон содержит батарею.

#include <iostream>
#include <string>
using namespace std;

// создайте необходимые классы и методы

int main() {
    Phone phone(5000);
    phone.displayInfo();

    return 0;
}
```

#### Пояснение:
- Батарея не может существовать без телефона, что делает это композицией.

---