Я считаю, что лучше, чем операторы if, использовать таблицу диспетчеризации - по сути это словарь из «типа» для функции указатель / делегат. Если дочерний класс отвечает за регистрацию себя в таблице, тогда ваша функция отправки выглядит просто так:
void DoStuff(Base ^base)
{
System::Type ^type = base->GetType();
m_DispatchTable[type](base);
}
и для добавления новой отправки нужно просто зарегистрироваться в таблице - обновление кода не требуется. Это позволяет избежать сохранения агрегата «если», и, если вам когда-либо понадобится вызвать более одной функции, вы можете сделать вашу таблицу диспетчеризации более сложной.