Чтобы сделать Base
полиморфным типом, вам нужно дать ему хотя бы одну виртуальную функцию. Самым простым в этом случае будет деструктор:
class Base {
public:
virtual ~Base() { }
};
Относительно вашего вопроса об уборке:
Технически, есть некоторое неопределенное поведение в обоих направлениях, потому что объекты, на которые ссылается карта, уничтожаются до того, как указатели будут удалены с карты. Это приводит к тому, что карта, когда она разрушена, содержит недопустимые указатели, что приводит к неопределенному поведению.
В практических целях это не вызывает проблем ни с одним известным компилятором.
В противном случае вы все правильно очищаете.
Но в way2 вы можете сделать упрощение. Когда Base
имеет виртуальный деструктор, вы можете просто сделать
delete b.find("abc")->second;
без динамического приведения.