Search code examples
c++exceptionvirtual-functionsexception-specification

Exception specification when overriding a virtual function


Consider the following code:


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

class B: public A
{
public:
    void f() throw ( int, double ) { }
};

When compiled, it says that derived class B has a looser throw specifier compared to A. What is the importance of this? If we try to exchange their exception specification, such that A::f() throws int and double while B::f() throws only int, the error does not appear.


Solution

    1. Don't use exception specifications in C++. It's very counter-intuitive compared to, say, Java's ones.
    2. Having a wider specification in the derived class breaks LSP (Liskov Substitution Principle).

    To expand on point 2: A's callers expect that only int comes out, but if you use a B (which, because it's publicly derived from A, also means it's usable as an A), suddenly double can come out too, and that would break A's contract (that only int gets thrown).