Вопрос:

Напиши программу на C++, в которой будут задействованы основные концепции объектно-ориентированного программирования

Ответ ассистента

Конечно, вот пример программы на C++, демонстрирующей основные концепции объектно-ориентированного программирования (ООП):

```cpp

include include

// 1. Инкапсуляция: Класс "Animal" объединяет данные (name, breed) и методы (get/set) для работы с ними. class Animal { private: std::string name; std::string breed;

public: // Конструктор класса Animal(std::string name, std::string breed) : name(name), breed(breed) {}

// Методы доступа к приватным данным (геттеры) std::string getName() const { return name; } std::string getBreed() const { return breed; } // Методы изменения приватных данных (сеттеры) void setName(std::string name) { this->name = name; } void setBreed(std::string breed) { this->breed = breed; } // Виртуальный метод, который будет переопределен в производных классах (для полиморфизма) virtual void makeSound() const { std::cout << "Generic animal sound" << std::endl; } // Метод для вывода информации о животном void printInfo() const { std::cout << "Name: " << name << ", Breed: " << breed << std::endl; }

};

// 2. Наследование: Класс "Dog" наследует свойства и методы класса "Animal". class Dog : public Animal { private: std::string color;

public: // Конструктор класса "Dog" вызывает конструктор базового класса "Animal" Dog(std::string name, std::string breed, std::string color) : Animal(name, breed), color(color) {}

// Переопределение виртуального метода "makeSound" (полиморфизм) void makeSound() const override { std::cout << "Woof!" << std::endl; } // Дополнительный метод, специфичный для класса "Dog" void wagTail() const { std::cout << "Wagging tail" << std::endl; } void printInfo() const { Animal::printInfo(); // Вызов метода базового класса std::cout << "Color: " << color << std::endl; }

};

// 2. Наследование: Класс "Cat" наследует свойства и методы класса "Animal". class Cat : public Animal { public: // Конструктор класса "Cat" вызывает конструктор базового класса "Animal" Cat(std::string name, std::string breed) : Animal(name, breed) {}

// Переопределение виртуального метода "makeSound" (полиморфизм) void makeSound() const override { std::cout << "Meow!" << std::endl; }

};

int main() { // Создание объектов классов Animal animal("Generic Animal", "Unknown"); Dog dog("Buddy", "Golden Retriever", "Golden"); Cat cat("Whiskers", "Siamese");

// 3. Полиморфизм: Вызов метода "makeSound" для разных объектов приводит к разному поведению. animal.makeSound(); // Вывод: Generic animal sound dog.makeSound(); // Вывод: Woof! cat.makeSound(); // Вывод: Meow! // Вывод информации о животных animal.printInfo(); dog.printInfo(); cat.printInfo(); // Пример использования метода, специфичного для класса "Dog" dog.wagTail(); // Вывод: Wagging tail return 0;

} ```

Пояснения к коду:

  • Инкапсуляция: Класс Animal объединяет данные (name, breed) и методы для работы с ними. Данные объявлены как private, что означает, что они доступны только внутри класса. Для доступа к данным используются методы getName, getBreed, setName, setBreed.
  • Наследование: Классы Dog и Cat наследуют свойства и методы класса Animal. Это означает, что они автоматически получают все атрибуты и функции, определенные в Animal.
  • Полиморфизм: Виртуальная функция makeSound определена в классе Animal и переопределена в классах Dog и Cat. Когда вызывается animal->makeSound(), вызывается версия функции, соответствующая фактическому типу объекта, на который указывает animal.

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

Другие решения

Что ещё задавали пользователи