覆盖虚函数时的异常规范

jas*_*ine 6 c++ virtual-functions exception exception-specification

请考虑以下代码:


class A
{
public:
    virtual void f() throw ( int ) { }
};

class B: public A
{
public:
    void f() throw ( int, double ) { }
};
Run Code Online (Sandbox Code Playgroud)

在编译时,它表示派生类B与A相比具有更宽松的抛出说明符.这有什么重要性?如果我们尝试交换它们的异常规范,例如A :: f()抛出int和double而B :: f()只抛出int,则不会出现错误.

Chr*_*ung 13

  1. 不要在C++中使用异常规范.与Java相比,这是非常反直觉的.
  2. 在派生类中具有更宽的规范会破坏LSP(Liskov替换原则).

扩展第2点:A调用者希望只有int出现,但是如果你使用a B(因为它是公开衍生的A,也意味着它可以用作A),突然double也会出现,这会破坏A合同(只会int被抛出).