首页 >后端开发 >C++ >您是否应该继承 C STL 容器:风险和替代方案?

您是否应该继承 C STL 容器:风险和替代方案?

DDD
DDD原创
2024-11-26 14:13:101044浏览

Should You Inherit from C   STL Containers: Risks and Alternatives?

从 C STL 容器派生的风险

尽管从 C STL 容器派生类具有潜在的优势,例如函数重载、模板专门化和改进的调试,但这种方法存在固有的风险。

考虑以下示例:

#include <vector>

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

int main() {
  auto p1 = new Rates;
  auto p2 = new Charges;
  kill_it(p2); // User code that knows nothing about Rates or Charges
  kill_it(p1);
  return 0;
}

kill_it 函数在执行 std::vector 的非虚拟析构函数时删除受害者的内存。这可能会导致 Charges(派生类)出现潜在问题,但不会导致 Rates(typedef)出现问题。

如果用户无意中在kill_it 函数的 ??? 中引入错误,就会出现问题。部分。例如,如果用户在调用kill_it(p2)之前修改p2以指向Rates对象,则std::vector的非虚拟析构函数将被调用。将被调用,从而导致不正确的行为。

为了减轻这种风险,通常建议在处理 STL 容器时使用组合而不是派生。组合允许更灵活且不易出错的方法。

以上是您是否应该继承 C STL 容器:风险和替代方案?的详细内容。更多信息请关注PHP中文网其他相关文章!

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