我需要如何使用虚拟功能" what()"?

时间:2018-03-15 19:27:14

标签: c++ exception polymorphism virtual-functions

给出一个类Stack(例如):

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将是什么输出?
我需要在what()类中声明Exception函数的工作原理吗?

1 个答案:

答案 0 :(得分:1)

what()的虚拟std::exception方法是为您的例外提供有意义的消息的好方法,也是始终根据std::exception创建自己的例外的好理由。

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

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

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

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子句中获取您的消息。