Указатель unique_ptr на базу в C++
Статический тип unique_ptr может быть базой,
а в куче лежит объект потомка.
Чтобы при уничтожении указателя сработал
полный деструктор потомка, у базы нужен
виртуальный деструктор. Виртуальный
метод базы через -> попадет в реализацию
потомка. Запишем классы User и Student:
#include <iostream>
#include <memory>
class User {
public:
virtual void greet() {
std::cout << "user\n";
}
virtual ~User() {}
};
class Student : public User {
public:
void greet() override {
std::cout << "student\n";
}
};
Создадим Student внутри
unique_ptr<User> и выведем приветствие:
int main() {
std::unique_ptr<User> owner =
std::make_unique<Student>();
owner->greet();
return 0;
}
Сделайте базу Device с виртуальным
методом label и виртуальным деструктором,
потомка Phone с другим текстом.
Сохраните Phone в unique_ptr<Device>,
вызовите label и дождитесь автоматического
удаления при выходе из main.