dynamic_cast должен быть тем, что вы ищете.
EDIT:
DerivedType m_derivedType = m_baseType; // gives same error
Вышеприведенное, кажется, пытается вызвать оператор присваивания, который, вероятно, не определен для типа DerivedType, и принимает тип BaseType.
DerivedType * m_derivedType = (DerivedType*) & m_baseType; // gives same error
Вы находитесь на правильном пути здесь, но использование dynamic_cast попытается безопасно привести к предоставленному типу, и в случае неудачи будет возвращено NULL.
Запустив здесь память, попробуйте это (но обратите внимание, что приведение вернет NULL, когда вы преобразуете из базового типа в производный тип):
DerivedType * m_derivedType = dynamic_cast<DerivedType*>(&m_baseType);
Если m_baseType был указателем и фактически указывал на тип DerivedType, то dynamic_cast должен работать.
Надеюсь, это поможет!