Exception specification when overriding a virtual function
c++, exception, exception-specification, virtual-functions
Solution
- Don't use exception specifications in C++. It's very counter-intuitive compared to, say, Java's ones.
- 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).
Problem
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.