Dlaczego kontenery STL nie mają wirtualnych destruktorów?

Dlaczego kontenery STL nie mają wirtualnych destruktorów?

Wirtualny destruktor jest przydatny tylko w scenariuszach dziedziczenia. Kontenery STL nie są przeznaczone do dziedziczenia (ani nie jest to obsługiwany scenariusz). Dlatego nie mają wirtualnych destruktorów.


Myślę, że Stroustrup pośrednio odpowiedział na to pytanie w swoim fantastycznym artykule:Dlaczego C++ nie jest tylko językiem programowania obiektowego:

STL został zbudowany z myślą o trzech narzędziach koncepcyjnych. Programowanie ogólne + styl funkcjonalny + abstrakcja danych ==styl STL . Nic dziwnego, że OOP nie jest najlepszy sposób reprezentowania biblioteki Struktury danych i algorytmów. Chociaż OOP jest używany w innych częściach standardowej biblioteki, projektant STL zauważył, że połączenie trzech wspomnianych technik jest lepsze niż OOP sam . Krótko mówiąc, biblioteka nie została zaprojektowana z myślą o OOP, aw C++, jeśli jej nie używasz, nie jest dołączana do twojego kodu. Nie płacisz za to, czego nie używasz. Klasy std::vector, std::list,... nie Koncepcje OOP w sensie Java/C#. To tylko abstrakcyjny typ danych w najlepszej interpretacji.


Wydaje mi się, że jest to zgodne z filozofią C++ polegającą na niepłaceniu za funkcje, których nie używasz. W zależności od platformy wskaźnik wirtualnego stołu może być wysoką ceną do zapłacenia, jeśli nie zależy ci na posiadaniu wirtualnego destruktora.