Heim > Backend-Entwicklung > C++ > Warum sollte ich das Erben von „std::string' in C vermeiden?

Warum sollte ich das Erben von „std::string' in C vermeiden?

Barbara Streisand
Freigeben: 2024-12-29 06:21:10
Original
858 Leute haben es durchsucht

Why Should I Avoid Inheriting from `std::string` in C  ?

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:

  • Private Vererbung: Für Mixins und aspektorientierte Programmierung Vorlagen.
  • Öffentliche Vererbung: Speziell für polymorphe Szenarien.

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.
}
Nach dem Login kopieren

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!

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