Во-первых, список (list) из Python — это не
std::list, а
std::vector в C++.
Во-вторых, чтобы избавиться от проблем с удалением объектов, вместо обычных указателей используй
std::unique_ptr из
#include <memory>.
Выглядеть управление объектами будет как-то так:
std::vector<std::unique_ptr<Figure>> figures;
std::vector<std::unique_ptr<Decoration>> decorations;
figures.push_back(std::make_unique<Ball>(аргументы для конструктора Ball));
figures[0]->какой-нибудь метод Figure
В-третьих, чтобы наследование не вызывало неопределённого поведения, тебе (в обычной жизни, если ты не гуру разработчик компилятора) обязательно нужно объявить виртуальный деструктор в базовом классе:
virtual ~Figure() = default; + для Decoration.
В-четвёртых, по сути вопроса, чтобы иметь возможность сделать что-то полезное с Figure/Decoration, нужно добавить в них виртуальные функции (методы) C++ и вызывать примерно так, как я написал выше. Эту тему предлагаю освоить самому.