c++ - 关于异常,覆盖标准异常方法

标签 c++ class oop exception

我正在尝试覆盖异常方法 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 {

    }
};

简单来说,constnoexcept 是函数限定符。如果你改变它们,你不是在覆盖一个函数,而是在创建一个重载(void foo()void foo() const 一样不同void foo()void foo(int))。

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

关于c++ - 关于异常,覆盖标准异常方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57627723/

相关文章:

java - 如何将方法包装在异步代码部分周围

Python 类/对象 __str__ 和其他问题

c++ - Windows MessageBox 忽略 WM_CLOSE

c++ - 共享对象文件中的 undefined symbol

c++ - 定义 volatile 类对象

c++ - 内联失败 : function body can be overwritten at link time

java - 创建新类对象时出现另一个 'cannot find symbol' 错误

java - 将变量传递给不同的类

Java 接口(interface)——为什么没有私有(private)方法?

html - 面向对象的 CSS