我已经创建了自己的异常类,该异常类派生自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()
的成员。这会导致错误。
使baseException
从runtime_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