Untitled
unknown
plain_text
2 years ago
3.8 kB
7
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