我已经创建了自己的异常类,该异常类派生自runtime_error,并且在c'tor中得到了一个int值。

我想为此异常创建一个基类,以便使用多态性,因此我只能捕获基类,并且基本上可以捕获派生类,然后从中调用.what()方法。

因此,这是基类:(在另一个cpp文件中的OFC,我得到了baseException ::〜baseException(){})

class baseException
{
    virtual ~baseException()=0 {}
    virtual const char* what()=0;
};


这是派生类:

class myException: public runtime_error, public baseException
{
public:
    myException(int): runtime_error("Error occured") {}
    const char* what() {return runtime_error::what();}
};


但是当我主要写的时候:

catch(baseException* x)
{
cout<<x->what();
}


即使myException继承自baseException,它也只会跳过它并且不会进入该块。有什么建议吗?

最佳答案

您捕获到对baseException对象的引用;因此,您只知道该类的方法。 baseException但是没有名为what()的成员。这会导致错误。
使baseExceptionruntime_error派生或直接捕获myException

编辑:

此片段显示绝对没有理由不应该将指针与异常一起使用:

#include <iostream>
#include <string>

class A {
public:
    virtual int test() = 0;
};

class B : public A {
public:
    virtual int test() {
        return 42;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    try {
        throw new std::string("foo");
    } catch (std::string* ecx){
        std::cout << *ecx << std::endl;
    }

    try {
        throw new B();
    } catch (A* ecx) {
        std::cout << ecx->test() << std::endl;
    }
}


输出:


  富
  
  42

07-27 19:06