Die potenzielle Gefahr der Ableitung von C-STL-Containern
Die Praxis der Ableitung von C-Standardbibliothekscontainern (STL) war Gegenstand von Debatte, wobei einige gegen seine Verwendung argumentierten. Trotz wahrgenommener Vorteile, wie etwa der Überlastung von Funktionen und der Ermöglichung einer Spezialisierung, sind mit diesem Ansatz potenzielle Risiken verbunden.
Das Fehlen virtueller Destruktoren in STL-Containern stellt eine erhebliche Gefahr dar. Wenn Sie eine Klasse von einem STL-Container ableiten, dem ein virtueller Destruktor fehlt, ist die abgeleitete Klasse möglicherweise nicht in der Lage, polymorphes Verhalten ordnungsgemäß zu verarbeiten. Dies kann zu unerwarteten Ergebnissen führen, insbesondere wenn Objekte abgeleiteter Klassen in Containern gespeichert werden und über Basisklassenzeiger darauf zugegriffen wird.
Betrachten Sie zur Veranschaulichung das folgende Szenario:
#include <vector> void kill_it(std::vector<double> *victim) { delete victim; // Invokes non-virtual ~std::vector<>() } typedef std::vector<double> Rates; class Charges: public std::vector<double> { }; int main() { std::vector<double> *p1, *p2; p1 = new Rates; p2 = new Charges; // Possible error introduced by user code kill_it(p2); kill_it(p1); return 0; }
In diesem Beispiel , hat die kill_it-Funktion keine Kenntnis von der abgeleiteten Klasse Charges. Folglich wird der nicht-virtuelle Destruktor der Basisklasse std::vector
Ein weiteres potenzielles Problem bei der Ableitung von STL-Containern ergibt sich aus der Implementierung der Vektorklasse durch Microsoft. In dieser Implementierung wird die Vektorklasse selbst durch Vererbung implementiert, wobei vector<> öffentlich abgeleitet von _Vector_Val<>. Dies erhöht die Komplexität und potenzielle Gefahren bei der Arbeit mit abgeleiteten Klassen.
Während die Verwendung der Vererbung in bestimmten Szenarien Vorteile bieten kann, gehen die Vorteile oft mit erhöhter Komplexität und potenziellen Risiken einher. Die Zusammensetzung, bei der ein Container als Mitgliedsvariable statt einer Basisklasse verwendet wird, wird im Allgemeinen aus Gründen der Klarheit und zur Vermeidung potenzieller Probleme im Zusammenhang mit der Ableitung bevorzugt.
Das obige ist der detaillierte Inhalt vonSollten Sie von C-STL-Containern erben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!