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