Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
3.8 kB
2
Indexable
Never
#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;
}
Leave a Comment