Warum es nicht ratsam ist, von std::string zu erben
In Effective C liegt der Schwerpunkt auf der Tatsache, dass eine virtuelle Der Destruktor ist entscheidend für die Fähigkeit einer Klasse, polymorphes Verhalten zu zeigen. Das Fehlen eines virtuellen Destruktors in std::string verhindert daher effektiv die Ableitung davon. Dies führt uns zu der Frage: Welche zusätzlichen Kriterien muss eine Klasse erfüllen, um sich als geeignete Basisklasse zu qualifizieren?
Berechtigung für den Basisklassenstatus
Entgegen der impliziten Annahme In der Frage muss eine Klasse keinen Polymorphismus unterstützen, um als Basisklasse zu dienen. Die Vererbung in C dient zwei Hauptzwecken:
std::string als Basisklasse
Der Grund geht über das Fehlen eines virtuellen Destruktors hinaus. std::string war nie dazu gedacht, als Basisklasse zu fungieren, weder polymorph noch anderweitig. Dies kann auf die Eigenschaften von Klassen in C zurückgeführt werden.
Im Gegensatz zu anderen objektorientierten Sprachen, in denen Klassen Referenztypen sind, behandelt C Klassen als Werttypen. Wenn ein Basisklassenobjekt kopiert wird, werden daher nur seine Mitglieder kopiert, nicht die Mitglieder abgeleiteter Klassen. Dieses als Slicing-Problem bekannte Phänomen kann zu Inkonsistenzen und fehlerhaftem Verhalten führen.
Anstatt Vererbung zur Methodenerweiterung zu implementieren, gilt es in C daher als bewährte Methode, Nicht-Friend- und Nicht-Member-Funktionen zu verwenden oder Komposition. Die Vererbung sollte der Metaprogrammierung von Vorlagen oder der Etablierung von polymorphem Verhalten vorbehalten sein.
Verhindern nicht-polymorpher Vererbung
In Fällen, in denen eine Basisklasse ausschließlich für die Wiederverwendbarkeit von Code gedacht ist, ist dies der Fall Es gibt keine wirksame Möglichkeit, die Erstellung von Zeigern auf abgeleitete Klassen zu verhindern. Die Verwendung privater Vererbung, die Einschränkung des Zugriffs abgeleiteter Klassenmethoden und die Vermeidung öffentlicher Basisklassenmethoden können jedoch von deren Verwendung abhalten.
Das obige ist der detaillierte Inhalt vonWarum sollten Sie das Erben von „std::string' vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!