Реализовать иерархию классов на Си. Покритикуете код?

Конечно, вот пример кода, демонстрирующий иерархию классов на C++:

#include <iostream>

// Базовый класс "Животное"
class Animal {
public:
    void eat() {
        std::cout << "Animal is eating" << std::endl;
    }

    virtual void makeSound() {
        std::cout << "Animal is making a sound" << std::endl;
    }
};

// Подкласс "Собака", наследуется от класса "Животное"
class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Dog says: Woof woof!" << std::endl;
    }
};

// Подкласс "Кошка", наследуется от класса "Животное"
class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Cat says: Meow meow!" << std::endl;
    }
};

int main() {
    Animal* animal = new Animal();
    Dog* dog = new Dog();
    Cat* cat = new Cat();

    animal->makeSound();
    dog->makeSound();
    cat->makeSound();

    delete animal;
    delete dog;
    delete cat;

    return 0;
}

В этом примере мы создали базовый класс Animal и два подкласса: Dog и Cat, которые наследуются от класса Animal. Метод makeSound() переопределен в каждом подклассе для вывода соответствующего звука.

Код можно улучшить, добавив виртуальный деструктор в базовый класс Animal, чтобы правильно удалять объекты при использовании оператора delete. Также можно добавить проверку на nullptr, чтобы убедиться, что указатель не указывает на нулевой адрес перед вызовом метода класса.

Надеюсь, что данное пояснение помогло вам понять основы иерархии классов на C++. Если у вас есть еще вопросы, не стесняйтесь задавать!