从 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
从 STL 容器派生的另一个潜在问题来自 Microsoft 对向量类的实现。在该实现中,向量类本身是通过继承来实现的,其中向量公开源自 _Vector_Val<>。这在使用派生类时增加了额外的复杂性和潜在危险。
虽然在某些情况下使用继承可能有优势,但好处通常伴随着复杂性和潜在风险的增加。为了清晰起见并避免与派生相关的潜在问题,通常首选使用容器作为成员变量而不是基类的组合。
以上是您应该继承 C STL 容器吗?的详细内容。更多信息请关注PHP中文网其他相关文章!