Практика на наследование в C++
Задачи строят иерархию с общим базовым классом, переопределяют виртуальные методы в наследниках и проверяют поведение через указатель на базу.
Сделайте класс Animal с виртуальным
методом speak, возвращающим
"...". Сделайте классы Dog
и Cat, которые возвращают "woof"
и "meow". Выведите оба звука через
указатель Animal*.
Дан класс:
class Device {
public:
std::string id;
Device(std::string value) : id(value) {}
virtual std::string status() { return "off"; }
};
class Phone : public Device {
public:
Phone(std::string value) : Device(value) {}
std::string status() override { return "idle"; }
};
Создайте Phone("p1"), сохраните в переменную
типа Device*. Выведите status
и id.
Сделайте класс Base с виртуальным методом
tag, возвращающим "B".
Сделайте класс Derived, переопределите
tag так, чтобы возвращалось "D",
и добавьте метод fullTag - склейку
Base::tag и tag
без разделителя. Выведите fullTag.
Сделайте класс Account с защищенным
полем owner. Сделайте класс Savings
с методом ownerName, возвращающим
owner. Проверьте для владельца "Kim".
Сделайте класс Person с конструктором
name. Сделайте класс Worker
с параметрами name и role
и вызовом конструктора предка. Выведите
имя и роль.
Даны типы:
class Shape {};
class Circle : public Shape {};
class Square : public Shape {};
std::vector<Shape*> items = {
new Circle(),
new Square(),
new Circle(),
};
Выведите, сколько элементов списка являются
Circle, используя dynamic_cast.
Сделайте класс Label с полем text
и виртуальным методом render.
Сделайте BoldLabel, который возвращает
строку в верхнем регистре. Выведите результат
для "note" через указатель на Label.
Дана переменная:
class User {
public:
std::string login;
User(std::string value) : login(value) {}
virtual ~User() = default;
};
class Admin : public User {
public:
std::string scope;
Admin(std::string loginValue, std::string scopeValue)
: User(loginValue), scope(scopeValue) {}
};
User* u = new Admin("root", "all");
Получите объект Admin из u
и выведите scope. Если тип другой,
выведите "none".