首页 > 解决方案 > 带有 bad_alloc 的虚拟类的多态性

问题描述

我从 C++ 开始,出于好奇,我试图用多态性捕获异常。我在尝试捕获std异常时观察差异行为,例如bad_alloc与我的自定义异常

在案例 1 中,我抛出了一个bad_alloc异常,该异常被带有参数 () 的 catch 语句捕获,exception ewhat 语句将异常显示为bad_alloc()

在案例 2 中,我抛出MyException的它是从异常类派生的,它被带有参数 ( exception e) 的 catch 语句捕获,what 语句显示异常是一个"Unknown exception"我可以认为它正在调用what()基类异常的函数的异常。

在案例 3 中,我可以在使用指针时从 catch调用what()子类的函数并打印出来MyException"My custom Exception"

#include<iostream>
using namespace std;

class MyException : public exception {
public:

    const char* what() const throw() {
        return "My custom Exception";
    }
};
int main() {    

    try {
        bool case1 = false, case2=true, case3=true;
        if (case1) {
            throw bad_alloc(); 
        }
        if (case2) {
            throw MyException();
        }
        if (case3) {
            MyException* o = new MyException();
            throw o;
        }
        
    }   
    catch (exception* e) {
        cout << endl << "catching exception with polymorphism, exception type  is " << e->what();

    }
    catch (exception e) {
        cout << endl << "catching exception with polymorphism  exception type  is " << e.what();

    }

}

我的疑问是,当有规则应该使用基类类型的指针或引用访问虚拟函数(在这种情况下)以实现运行时多态性时,bad_alloc异常如何能够调用自身的函数。在这种情况下,子类对象直接以多态性访问虚函数。what()what()

标签: c++c++11exceptionpolymorphismtry-catch

解决方案


推荐阅读