从 std::string 继承的危险
虽然使用继承可以提供代码可重用性,但了解类的具体要求非常重要作为基类。 《Effective C》强调的一个关键考虑因素是,如果一个类打算表现出多态性,则应该有一个虚拟析构函数。
但是,std::string 不具有虚拟析构函数,这会引发对其继承的担忧。问题是缺少虚拟析构函数是否是避免从 std::string 继承的唯一原因。
在 C 中,继承主要用于两个目的:
非多态继承在C中没有实用价值,可以避免。自由函数提供了更合适的替代方案,允许您扩展类,而无需强制客户端切换到自定义字符串类。
切片问题
在 C 中,类是值类型,与其他 OO 语言中的引用类型不同。这会导致切片问题,即按值传递的对象被截断为基类大小,从而导致不一致。下面的代码片段对此进行了演示:
如果将 std::string 的派生对象传递给此函数,则会出现切片问题,从而导致意外行为。由于非派生函数与基类成员紧密耦合,因此可能会出现这些不一致。
结论
除非明确需要多态行为,否则请避免从 std::string 继承。出于代码可重用性的目的,优先选择非成员函数和不用于继承的类中的成员。通过遵循这种做法,您可以确保代码的可维护性并防止与继承不匹配相关的潜在问题。
以上是为什么我应该避免从 C 中的 `std::string` 继承?的详细内容。更多信息请关注PHP中文网其他相关文章!