我需要如何使用虚函数 "what()"?

How I need to work with the virtual function "what()"?

给定一个classStack(例如):

class Stack {
    // ...
    class Exception : public std::exception {};
    class Full : public Exception {};
    class Empty : public Exception {};
};

让我们看看下一个函数f(例如):

void f() {
    try {
        Stack s(100); // Only for the example. 
    } catch (Stack::Full& e) {
        cerr << "Not enough room";
    } catch (Stack::Exception& e) {
        cerr << "Error with stack";
    } catch (std::exception& e) {
        cerr << e.what() << endl;
    }
}

如果它走到最后 catch 输出会是什么?
我需要在 Exception class 中声明关于 what() 函数的工作吗?

std::exception 的虚拟 what() 方法是一种向您的异常提供有意义的消息的好方法,也是始终基于 std::exception 创建自己的异常的一个很好的理由。 =21=]

这种方法的好处在于它是 STL 的标准化部分。 what() 中的 STL 异常 return 条有意义的消息。 这也意味着,如果您要在 Stack 中的某处使用套接字代码,您会用 catch (std::exception& e) 捕获它,例如在不知道有关异常的更深入细节的情况下打印出错误消息。

与此相反,non-standardized 方法显然只有在您明确捕获特定已知类型的异常时才可用。

就您的示例而言,这意味着您可以像这样创建异常:

class Stack {
    // ...
    class Exception : public std::exception {
        virtual const char* what() override { return "Unspecified stack error"; }
    };
    class Full : public Exception {
        virtual const char* what() override { return "Stack is full"; }
    };
    class Empty : public Exception {
        virtual const char* what() override { return "Stack is empty"; }
    };
};

然后您在 try/catch 中只需要捕获 std::exception:

void f() {
    try {
        Stack s(100); // Only for the example. 
    } catch (std::exception& e) {
        cerr << e.what() << endl;
    }
}

由于您的异常基于 std::exception,并且您覆盖了 virtual const char* what(),您将在 catch 子句中获得消息。