Heim >Backend-Entwicklung >C++ >Sollten Sie von C-STL-Containern erben?

Sollten Sie von C-STL-Containern erben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-01 11:58:11929Durchsuche

Should You Inherit from C   STL Containers?

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 aufgerufen, was zu undefiniertem Verhalten beim Zerstören eines Objekts vom Typ Charges führen kann. Dieses Verhalten würde nicht auftreten, wenn Charges als Typalias oder Typedef implementiert würde, wie es bei Rates der Fall ist.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn