Veja a nota para
dynamic_cast , throw , typeid não funciona com bibliotecas compartilhadas
na página de perguntas frequentes do GCC. Porque você está usando
dlopen() , você precisa vincular seu executável com o -E flag (ou passe-Wl,-E para g++ se g++ está invocando o linker) e passe o RTLD_GLOBAL sinalizar para dlopen() .