为什么从 std::string 继承是不明智的
在《Effective C》中,重点是虚拟的析构函数对于类表现出多态行为的能力至关重要。因此,std::string 中缺少虚拟析构函数,有效地禁止从中派生。这引出了我们的问题:一个类必须满足哪些附加条件才能成为合适的基类?
基类状态的资格
与隐含的假设相反在这个问题中,一个类不需要支持多态性来充当基类。 C 中的继承有两个主要目的:
std::string 作为基类
原因不仅仅是缺少虚拟析构函数。 std::string 从未打算用作基类、多态类或其他类。这可以归因于 C 中类的属性。
与其他类是引用类型的面向对象语言不同,C 将类视为值类型。因此,当复制基类对象时,仅复制其成员,而不复制任何派生类的成员。这种现象称为切片问题,可能会导致不一致和错误行为。
因此,在 C 中,使用非友元、非成员函数而不是实现方法扩展的继承被认为是最佳实践或组成。继承应该保留用于模板元编程或建立多态行为。
防止非多态继承
在基类仅用于代码可重用性的情况下,有没有有效的方法来阻止创建指向派生类的指针。但是,使用私有继承、限制派生类方法的访问以及避免公共基类方法可能会阻碍它们的使用。
以上是为什么应该避免继承`std::string`?的详细内容。更多信息请关注PHP中文网其他相关文章!