Gefahren der Vererbung von std::string
Während die Verwendung von Vererbung die Wiederverwendbarkeit von Code ermöglichen kann, ist es wichtig, die spezifischen Anforderungen für Klassen zu verstehen fungieren als Basisklassen. Eine entscheidende Überlegung, die von Effective C hervorgehoben wird, ist, dass eine Klasse einen virtuellen Destruktor haben sollte, wenn sie sich polymorph verhalten möchte.
Std::string verfügt jedoch nicht über einen virtuellen Destruktor, was Bedenken hinsichtlich der Vererbung von ihm aufwirft. Es stellt sich die Frage, ob das Fehlen eines virtuellen Destruktors der einzige Grund für die Vermeidung der Vererbung von std::string ist.
In C wird die Vererbung hauptsächlich für zwei Zwecke verwendet:
Nicht-polymorphe Vererbungen haben in C keinen praktischen Wert und können vermieden werden. Kostenlose Funktionen bieten eine geeignetere Alternative und ermöglichen es Ihnen, Klassen zu erweitern, ohne Clients zu zwingen, zu Ihrer benutzerdefinierten String-Klasse zu wechseln.
Das Slicing-Problem
In C sind Klassen Werttypen, im Gegensatz zu Referenztypen in anderen OO-Sprachen. Dies führt zum Slicing-Problem, bei dem übergebene Werteobjekte auf die Größe der Basisklasse gekürzt werden, was zu Inkonsistenzen führt. Dies wird im folgenden Codeausschnitt demonstriert:
int StringToNumber(std::string copyMeByValue) { // ... Your code to convert 'copyMeByValue' to a number. }
Wenn Sie ein abgeleitetes Objekt von std::string an diese Funktion übergeben, tritt das Slicing-Problem auf, was zu unerwartetem Verhalten führt. Da nicht abgeleitete Funktionen eng mit Basisklassenmitgliedern verknüpft sind, können diese Inkonsistenzen auftreten.
Fazit
Vermeiden Sie das Erben von std::string, es sei denn, Sie benötigen explizit polymorphes Verhalten . Aus Gründen der Wiederverwendbarkeit von Code bevorzugen Sie Nicht-Member-Funktionen und Member in Klassen, die nicht für die Vererbung vorgesehen sind. Durch die Einhaltung dieser Vorgehensweise können Sie die Wartbarkeit des Codes sicherstellen und mögliche Probleme im Zusammenhang mit Vererbungskonflikten verhindern.
Das obige ist der detaillierte Inhalt vonWarum sollte ich das Erben von „std::string' in C vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!