C++ 标准规定了以下关于具有异常规范的虚函数:
如果虚函数具有异常规范,则在任何派生类中覆盖该虚函数的任何函数的所有声明(包括定义)都应仅允许基类虚函数的异常规范(C + +03 §15.4/3)。
因此,以下格式不正确:
struct B {
virtual void f() throw() { } // allows no exceptions
};
struct D : B {
virtual void f() { } // allows all exceptions
};
(1) 此规则是否适用于析构函数?也就是说,下面的格式是否正确?
struct B {
virtual ~B() throw() { }
};
struct D : B {
virtual ~D() { }
};
(2) 该规则如何应用于隐式声明的析构函数?也就是说,下面的格式是否正确?
struct B {
virtual ~B() throw() { }
};
struct D : B {
// ~D() implicitly declared
};
虽然在一般情况下永远不应该编写异常规范,但这个问题具有实际意义,因为std::exception
析构函数是虚拟的并且具有空的异常规范。
由于不允许从析构函数中抛出异常是一种很好的做法,因此为了简化任何示例,我们假设析构函数要么允许所有异常(即,它没有异常规范),要么不允许异常(即也就是说,它有一个空的异常规范)。