l********n 发帖数: 54 | 1 父类的函数(pure virtual)抛出一个异常,子类继承。有如下代码
class Foo
{
public:
void virtual func() throw (int, float) = 0;
};
class Bar : public Foo
{
public:
void virtual func() throw(short); // line 1: compile error "
// looser throw specifier"
void virtual func() throw(); // line 2: can compile
void virtual func() throw(float, int); // line 3: can compile
void virtual func() throw(float |
s*****e 发帖数: 16824 | 2 throw的类型不对?
【在 l********n 的大作中提到】 : 父类的函数(pure virtual)抛出一个异常,子类继承。有如下代码 : class Foo : { : public: : void virtual func() throw (int, float) = 0; : }; : class Bar : public Foo : { : public: : void virtual func() throw(short); // line 1: compile error "
|
l********n 发帖数: 54 | 3 应该是的,不过如何来解释line 2-5。这个是因为什么rule呢?
我本来的想法是只有下面的exact match才行。
class Bar : public Foo
{
void virtual func() throw (int, float);
}
【在 s*****e 的大作中提到】 : throw的类型不对?
|
s*****e 发帖数: 16824 | 4 后面的类型都没问题吧,就是第二个我不是很吃的准,不指定类型应该也是可以的,因
为反正有个catch可以接受。
【在 l********n 的大作中提到】 : 应该是的,不过如何来解释line 2-5。这个是因为什么rule呢? : 我本来的想法是只有下面的exact match才行。 : class Bar : public Foo : { : void virtual func() throw (int, float); : }
|
l********n 发帖数: 54 | 5 说的有道理。假设子类继承后,只throw符合父类类型的异常(可以0个到n-1个)如下面,因为有catch可以接受。
void virtual func() throw (float)
不过试了下面的,我又觉得糊涂了。
void virtual func() throw(int, int); // can compile
void virtual func() throw(int, int, int); // can compile
【在 s*****e 的大作中提到】 : 后面的类型都没问题吧,就是第二个我不是很吃的准,不指定类型应该也是可以的,因 : 为反正有个catch可以接受。
|
M********5 发帖数: 715 | 6 呵呵,我觉得这个rule是没有问题的
我的理解,只要throw的exception是父类exception的子集就行了,它并不提供类型转
换的(所以short当然不能算int),你上面举的例子,throw三个int的exception,那也
是int的exception,而不是short的exception,个数跟类别是两个不同的概念
这是我的理解 |