关于异常,覆盖标准异常方法



我正在尝试覆盖异常方法,std::exception::what(),以制作自定义的异常消息。

编译器说,"覆盖函数的异常规范比基本版本更宽松",关于本节:

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

当像这样将"覆盖"切换为"noexcept"时:

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

它正在工作。但是,我也无法理解它们之间的区别,因为我确实想覆盖标准方法。据我所知,"noexcept"的意思是 - 不要抛出异常,不要覆盖方法。

如果您能以代码效率和正确性的方式解释我,我们将不胜感激。这是处理这个问题的正确方法吗?为什么无法覆盖?

谢谢。

你需要

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

override说明符是可选的。您仍将覆盖父函数。但是,noexcept指定该函数不会引发任何内容。如果省略父函数上存在的 this,编译器将抱怨,因为您随后指定重写函数可能会引发异常。

最新更新