我正在尝试覆盖异常方法 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”的意思是 - 不抛出异常,不覆盖方法。
如果您能以代码效率和正确性的方式向我解释,我将不胜感激。这是处理这个问题的正确方法吗?为什么无法覆盖?
谢谢。
最佳答案
你需要
class diffSizeExp : public std::exception
{
public:
const char* what() const noexcept override {
}
};
或
class diffSizeExp : public std::exception
{
public:
const char* what() const noexcept {
}
};
简单来说,const
和noexcept
是函数限定符。如果你改变它们,你不是在覆盖一个函数,而是在创建一个重载(void foo()
和 void foo() const
与 一样不同void foo()
和 void foo(int)
)。
但是,override
不是函数限定符。它只是一个辅助关键字,当您实际上没有覆盖虚函数时,使编译器抛出错误。它是可选的,只是为了帮助您发现潜在的错误(强烈建议将它用于每个虚函数)。
关于c++ - 关于异常,覆盖标准异常方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57627723/