Abgeleitete Klassen in std :: unique_ptr <Base> -Containern löschen

Ich bin ein wenig verwirrt. Grundsätzlich habe ich zwei verschiedene Ressourcenmanager (AudioLibrary und VideoLibrary), die beide von einer gemeinsam genutzten BaseLibrary-Klasse erben. Diese Basisklasse enthält Verweise auf Audio und Video. Sowohl Audio als auch Video erben von einer übergeordneten Klasse namens Media.

Ich behalte die Daten in einer Karte, die mit unique_ptr gefüllt ist. Zu meiner Überraschung habe ich jedoch festgestellt, dass beim Löschen dieser Zeiger über .erase nur der Basisdestruktor für Media aufgerufen wird.

Ich denke, ich habe etwas verpasst, aber ich dachte, dass die Compiler- / Laufzeitbibliothek wissen würde, dass sie entweder auf ein Video oder Audio verweist und es als Destruktor bezeichnet.

Scheint nicht der Fall zu sein. Ich bin gezwungen, so etwas zu tun, um tatsächlich alle meine Ressourcen zurückzugewinnen:

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;
}

Ist das normales Verhalten?

Aktualisieren:

Es geht dir gut - natürlich ist es die fehlende "Virtualität" des Destruktors. Ich denke, ich habe in letzter Zeit immer weniger darüber nachgedacht, was virtuell und vererbt bedeutet, und irgendwie hat sich mein Kopf in seiner Funktionalität verloren, als in den Konzepten selbst. Es passiert bei mir gelegentlich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage