Heim > Backend-Entwicklung > C++ > Ist das Erben von C-STL-Containern riskant?

Ist das Erben von C-STL-Containern riskant?

Barbara Streisand
Freigeben: 2024-11-29 03:45:09
Original
794 Leute haben es durchsucht

Is Inheriting from C   STL Containers Risky?

Risiken der Vererbung von C-STL-Containern

Es stellt sich die Frage, ob mit der Vererbung von Standard-C-Containern tatsächliche Risiken verbunden sind. Der Autor argumentiert, dass die Verwendung einer Typedef wie typedef std::vector Rates; ist ein sichererer Ansatz. Sie schlagen jedoch einen spezifischen Anwendungsfall vor, um mögliche Gefahren zu untersuchen.

Anwendungsfall

Bedenken Sie den folgenden Codeausschnitt:

#include <vector>
#include <iostream>

void kill_it(std::vector<double>& victim) {
    delete &victim;
}

typedef std::vector<double> Rates;
class Charges: public std::vector<double> { };

int main() {
  std::vector<double>* p1, *p2;
  p1 = new Rates;
  p2 = new Charges;
  kill_it(p2);
  kill_it(p1);
  return 0;
}
Nach dem Login kopieren

Der Der Autor schlägt vor, dass ein willkürlich unglücklicher Benutzer einen Fehler in das ??? einführen könnte. Abschnitt, der ein Problem mit Charges (der abgeleiteten Klasse) verursachen würde, aber nicht mit Rates (der Typdefinition).

Virtuelle Destruktoren

Das Hauptproblem hier ist dieser Standard C-Container haben keine virtuellen Destruktoren. Folglich können Sie sie nicht polymorph behandeln. Wenn Sie und alle Benutzer Ihres Codes sich an diesen Grundsatz halten, ist es nicht grundsätzlich falsch, von Standardcontainern zu erben. Aus Gründen der Klarheit empfiehlt der Autor jedoch die Komposition.

Komposition statt Vererbung

Anstatt von einem Container zu erben, ist es sauberer und sicherer, Komposition zu verwenden. Dazu gehört das Erstellen einer neuen Klasse, die eine Instanz des Containers als Mitgliedsvariable enthält. Dies ermöglicht mehr Flexibilität und Kontrolle über die Funktionalität Ihrer Klasse.

In diesem Anwendungsfall wird beispielsweise die Definition einer neuen Rates-Klasse, die eine Instanz von std::vector enthält, benötigt. würde es Ihnen ermöglichen, zusätzliche Funktionalität hinzuzufügen und gleichzeitig den zugrunde liegenden Container zu nutzen. Dieser Ansatz stellt außerdem sicher, dass der Destruktor Ihrer neuen Klasse ordnungsgemäß behandelt wird, unabhängig von der Basiscontainerimplementierung.

Das obige ist der detaillierte Inhalt vonIst das Erben von C-STL-Containern riskant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage