首页 >后端开发 >C++ >您应该继承 C STL 容器吗?

您应该继承 C STL 容器吗?

Barbara Streisand
Barbara Streisand原创
2024-12-01 11:58:11938浏览

Should You Inherit from C   STL Containers?

从 C STL 容器派生的潜在陷阱

从 C 标准库 (STL) 容器派生的实践一直是争论,一些人反对使用它。尽管有明显的优势,例如重载函数和实现专业化,但这种方法仍然存在潜在风险。

STL 容器中缺乏虚拟析构函数会带来重大危险。当从缺少虚拟析构函数的 STL 容器派生类时,派生类可能无法正确处理多态行为。这可能会导致意外结果,尤其是当派生类的对象存储在容器中并通过基类指针访问时。

为了说明这一点,请考虑以下场景:

#include <vector>

void kill_it(std::vector<double> *victim) {
    delete victim; // Invokes non-virtual ~std::vector<>()
}

typedef std::vector<double> Rates;
class Charges: public std::vector<double> { };

int main() {
    std::vector<double> *p1, *p2;
    p1 = new Rates;
    p2 = new Charges;
    
    // Possible error introduced by user code
    kill_it(p2);
    kill_it(p1);
    
    return 0;
}

在此示例中,kill_it 函数对派生类 Charges 没有任何了解。因此,它将调用基类 std::vector 的非虚拟析构函数,这可能会在销毁 Charges 类型的对象时导致未定义的行为。如果将 Charges 实现为类型别名或 typedef(如 Rates 所示),则不会发生此行为。

从 STL 容器派生的另一个潜在问题来自 Microsoft 对向量类的实现。在该实现中,向量类本身是通过继承来实现的,其中向量公开源自 _Vector_Val<>。这在使用派生类时增加了额外的复杂性和潜在危险。

虽然在某些情况下使用继承可能有优势,但好处通常伴随着复杂性和潜在风险的增加。为了清晰起见并避免与派生相关的潜在问题,通常首选使用容器作为成员变量而不是基类的组合。

以上是您应该继承 C STL 容器吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn