Excluindo Classes Derivadas em Contêineres std :: unique_ptr <Base>

Estou um pouco confuso. Basicamente, eu tenho dois gerenciadores de recursos diferentes (AudioLibrary e VideoLibrary) que ambos herdam de uma classe BaseLibrary compartilhada. Essa classe base contém referências para áudio e vídeo. O áudio e o vídeo são herdados de uma classe pai chamada Mídia.

Estou mantendo os dados em um mapa, preenchido com unique_ptr. Mas, para minha surpresa, descobri que quando esses ponteiros são excluídos via .erase, apenas o destruidor de base do Media é chamado.

Acho que perdi alguma coisa, mas pensei que a biblioteca do compilador / tempo de execução saberia que está apontando para um vídeo ou áudio e a chama de destruidora.

Parece não ser o caso. Sou forçado a fazer algo assim para recuperar todos os meus recursos:

void AudioLibrary::deleteStream( const std::string &pathFile )
{
    auto baseStream = mStreams[ pathFile ].release();
    mStreams.erase( pathFile );

    // Re-cast!
    auto aStream = static_cast<AudioStream*>( baseStream );
    delete aStream;
}

Esse comportamento é normal?

Atualizar:

Você está bem - é claro que é a falta de virtualidade do destruidor. Acho que recentemente pensei cada vez menos no que significa virtual e herança e meio que perdi minha cabeça em sua funcionalidade, em vez de nos próprios conceitos. Isso acontece comigo ocasionalmente.

questionAnswers(2)

yourAnswerToTheQuestion