【问题标题】:About Exceptions, overriding the standard exception methods关于异常,覆盖标准异常方法
【发布时间】: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

标签: c++ class oop exception


【解决方案1】:

你需要

class diffSizeExp : public std::exception
{
public:
    const char* what() const noexcept override {

    }
};

class diffSizeExp : public std::exception
{
public:
    const char* what() const noexcept {

    }
};

简单来说,constnoexcept 是函数限定符。如果你改变了这些,你并没有覆盖一个函数,你正在创建一个重载(void foo()void foo() constvoid foo()void foo(int) 不同)。

但是,override 不是函数限定符。它只是一个辅助关键字,当您实际上没有覆盖虚函数时,使编译器抛出错误。它是可选的,只是为了帮助您发现潜在的错误(强烈建议将它用于每个虚函数)。

【讨论】:

  • 感谢您的精彩解释。 :)
【解决方案2】:

override 说明符是可选的。您仍将覆盖父函数。但是,noexcept 指定该函数不抛出任何东西。如果你忽略它,它存在于父函数中,编译器会报错,因为你指定了你的覆盖函数可能会抛出异常。

【讨论】:

  • 谢谢您,先生!对不起,我还不能反馈,因为我的声誉还太低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2013-11-24
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多