【发布时间】:2012-04-07 11:35:30
【问题描述】:
我想用基类Exception 抛出我自己的异常。有一个虚拟方法print 将被子类覆盖。我只捕获Exception& 类型并使用print 来获取特定错误。问题是,一旦我抛出一个子类的引用,它就会被视为基类。
这是一个例子:
#include <iostream>
using namespace std;
class Exception
{
public:
virtual void print()
{
cout << "Exception" << endl;
}
};
class IllegalArgumentException : public Exception
{
public:
virtual void print()
{
cout << "IllegalArgumentException" << endl;
}
};
int main(int argc, char **argv)
{
try
{
IllegalArgumentException i;
Exception& ref = i;
cout << "ref.print: ";
ref.print();
throw ref;
}
catch(Exception& e)
{
cout << "catched: ";
e.print();
}
}
这个例子的输出是:
ref.print: IllegalArgumentException
catched: Exception
使用引用应该会导致使用派生类的print 方法。在 try 块内,引用确实使用它。为什么被捕获的Exception& 不像IllegalArgumentException 那样行事,我怎样才能得到这种行为?
下面的代码似乎做了它应该做的事情:
try
{
IllegalArgumentException i;
Exception* pointer = &i;
throw pointer;
}
catch(Exception* e)
{
cout << "pointer catched: ";
e->print();
}
但是在 try 块的范围之外指针不会变得无效吗?这样做是有风险的,如果我在堆上分配内存来解决这个问题,我有责任在 catch 块内删除,这也不是很漂亮。那么你将如何解决这个问题呢?
【问题讨论】:
-
你不能“通过引用抛出”。
-
@MooingDuck,感谢您提供的链接 - 我能够提供答案。不幸的是,答案在这个例子中不起作用。因此,我必须得出结论,这些问题并不相同。