Untitled
unknown
plain_text
a year ago
3.8 kB
6
Indexable
#include <iostream> #include <string> // Интерфейсный класс Bird class Bird { public: // Конструктор Bird(std::string name) : name(name), id(++counter) {} Bird() : name(name), id(++counter){} // Виртуальный деструктор virtual ~Bird() {} // Виртуальный метод 1 virtual void sing() const { std::cout << "Bird " << name << " is singing." << std::endl; } // Виртуальный метод 2 virtual void fly() const { std::cout << "Bird " << name << " is flying." << std::endl; } // Статический метод для получения количества созданных объектов static int getCounter() { return counter; } std::string name; protected: int id; private: // Статическое поле для подсчета созданных объектов static int counter; }; // Инициализация статического поля int Bird::counter = 0; // Класс, наследующий от Bird template<typename T> class Homebird : public Bird { public: // Конструктор Homebird(std::string name, T favoriteSong) : Bird(name), favoriteSong(favoriteSong) {} // Переопределение виртуального метода 1 void sing() const override { std::cout << "Homebird " << name << " is singing its favorite song: " << favoriteSong << std::endl; } // Переопределение виртуального метода 2 void fly() const override { std::cout << "Homebird " << name << " is flying gracefully." << std::endl; } private: T favoriteSong; }; // Класс, наследующий от Bird и созданный шаблоном template <typename T> class WildBird : public Bird { public: // Конструктор WildBird(std::string name, T specialData) : Bird(name), specialData(specialData) {} // Переопределение виртуального метода 1 void sing() const override { std::cout << "WildBird " << name << " is singing with special data: " << specialData << std::endl; } // Переопределение виртуального метода 2 void fly() const override { std::cout << "WildBird " << name << " is flying uniquely." << std::endl; } private: T specialData; }; // Перегрузка оператора ввода std::istream& operator>>(std::istream& input, Bird& b) { std::cout << "Enter bird name: "; std::getline(input, b.name); return input; } int main() { std::string birdName; std::string birdSong; try { WildBird<int> wildBird("UniqueBird", 42); Homebird<std::string> homeBird ("Bebra","Bebra2"); std::cout << "Enter name of HomeBird:" << std::endl; std::cin >> birdName; std::cout << "Enter favorite song of HomeBird" << std::endl; std::cin >> birdSong; Homebird<std::string> homeBird2 (birdName,birdSong); // позднее связывание Bird* birds[] = {&homeBird,&wildBird,&homeBird2}; // Вывод информации о птицах и подсчет созданных объектов for (int i = 0; i < 3; ++i) { birds[i]->sing(); birds[i]->fly(); } std::cout << "Total bird objects created: " << Bird::getCounter() << std::endl; } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }
Editor is loading...
Leave a Comment