std::exception : 使用虚函数和继承 vs 变量

std::exception : use of virtual function and inheritance vs a variable

为什么 std::exception 被设计成一种新类型的异常,派生的 class 覆盖了 virtual what() 函数,而不是 make可以容纳字符串的 class 和 what()?

上的 return
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 ...) 都可以是 class 的实例而不是派生的 class。

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

两个都可以用,都很好。标准库使用这种方法来生成不同的 'categories' 异常。

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

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