【问题标题】:std::exception : use of virtual function and inheritance vs a variablestd::exception :使用虚函数和继承与变量
【发布时间】:2018-06-27 09:47:52
【问题描述】:

std::exception 的设计方式是为了创建一种新类型的异常,创建一个覆盖 virtual what() 函数的派生类,而不是创建一个可以保存字符串并返回它的类的原因是什么?在what()?

class exception
{
    std::string msg;
public:
    exception(std::string _msg) : msg(_msg) {}
    void set(std::string _msg) { msg = _msg; }
    std:string what() { return msg; }
};

每个错误(bad_alloc, logical_error ...) 可能是该类的实例而不是派生类。

使用虚函数和继承而不是上述方法的原因是什么?

【问题讨论】:

  • std::exception 是抽象接口。如果你想要一个具体的基类来做你想做的事,考虑std::runtime_error
  • 您的exception 进行内存分配,因此大多数情况下与std::bad_alloc 异常“不兼容”。
  • @Jarod42 如果它是一个固定长度的字符数组呢?
  • 那么你的类将不能直接用于更长的消息。有一些事情要做。虚拟方式在这里似乎更好。

标签: c++ exception virtual-functions c++-standard-library


【解决方案1】:

catch 块不能是模板,这意味着必须指定一个可以隐式转换异常的类型。

拥有一个异常接口(std::exception) 允许在不知道或关心异常的真实类型的情况下捕获任何异常并获取错误消息。但如果他只想捕获那些异常,也可以让用户选择更精确的类型,如std::runtime_error

【讨论】:

    【解决方案2】:

    两者都可以使用并且非常好。标准库使用这种方法来制作不同的“类别”异常。

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2012-08-06
      • 2011-02-03
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多