【发布时间】:2019-12-28 20:43:15
【问题描述】:
我正在尝试覆盖异常方法std::exception::what(),以制作自定义异常消息。
编译器说,“覆盖函数的异常规范比基础版本更宽松”,关于本节:
class diffSizeExp : public std::exception
{
public:
const char* what() const override {
}
};
当像这样用 'noexcept' 切换 'override' 时:
class diffSizeExp : public std::exception
{
public:
const char* what() const noexcept {
}
};
它正在工作。但是,我也无法理解它们之间的区别,因为我确实想覆盖标准方法。据我所知,“noexcept”的意思是 - 不要抛出异常,不要覆盖方法。
如果您能以代码效率和正确性的方式向我解释,将不胜感激。这是处理这个问题的正确方法吗?为什么无法覆盖?
谢谢。
【问题讨论】:
-
noexcept之类的异常规范是函数签名的一部分,并且在覆盖虚拟函数时,通常要求匹配签名。继承的what()指定noexcept,所以不允许抛出异常。您的覆盖指定允许抛出异常。换句话说,您在派生类中比在基类中更加宽容 - 或者根据您的编译器松懈。 -
未来提示:一次只尝试一个。您尝试了两件事:删除
override,并添加noexcept。