Gründe, das Erben von der Klasse C std::string zu vermeiden
In Effective C die Empfehlung, das Erben von std::string zu vermeiden basiert auf dem Fehlen eines virtuellen Destruktors und seiner Ungeeignetheit als Basisklasse, selbst für polymorphe Zwecke. Das Verständnis der spezifischen Anforderungen für die Qualifizierung einer Klasse als Basisklasse und der Konsequenzen der Ableitung von std::string verdeutlicht diese Haltung weiter.
Berechtigung zur Basisklassenvererbung
Vererbbarkeit ist in C eng mit der Notwendigkeit polymorphen Verhaltens verbunden. Öffentliche Vererbung sollte nur verwendet werden, wenn auf eine Klasse über Zeiger oder Referenzen zugegriffen werden soll, was eine dynamische Bindung ermöglicht. Ansonsten sind freie Funktionen oder Komposition die bevorzugten Mechanismen für die Wiederverwendung von Code.
std::string als Basisklasse
Im Fall von std::string ist die Das Fehlen eines virtuellen Destruktors verhindert, dass polymorphes Verhalten effektiv unterstützt wird. Darüber hinaus ist sein internes Design nicht für die Verwendung als Basisklasse gedacht.
Probleme bei der Ableitung von std::string
Die Ableitung von std::string führt zu potenziellen Problemen aufgrund des Slicing-Verhaltens in C . Wenn eine Funktion beispielsweise einen std::string-Parameter erwartet, führt die Übergabe eines abgeleiteten Objekts zu einer abgeschnittenen Kopie, die zusätzliche Mitglieder der abgeleiteten Klasse ausschließt. Dies kann zu Inkonsistenzen und undefiniertem Verhalten führen.
Verhindern der Verwendung nicht-polymorpher Basisklassen
Um zu verhindern, dass Clients eine Basisklasse ausschließlich zur Wiederverwendbarkeit verwenden, als wäre sie eine polymorphe Basisklasse können die folgenden Techniken eingesetzt werden:
Das obige ist der detaillierte Inhalt vonWarum sollten Sie das Erben von der C-Klasse std::string vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!