1

It's all in this example

class MyException: std::runtime_error // note, there is no public keyword in inheritance
{
public:
   MyException(const std::string & x)
      : std::runtime_error(x)
   {}
};


int main( )
{
   try
   {
      throw MyException("foo");
   }
   catch (std::exception & e )
   {
      std::cout << "catched std exception: " << e.what() << std::endl;
   }
   catch (...)
   {
      std::cout << "catched ... " << std::endl;
   }
}

It writes on stdout string "catched ...". But, if I change inheritance to public as class MyException : public std::runtime_error, it works as expected (for me) and writes "catched std exception: foo"

What part of the c++ standard requires such behavior? And why? In what cases such behavior could be useful?

3 Answers 3

3

It makes sense and is consistent with the rules for overload resolution. Outside of MyException, your class is-not-an std::exception. You should see private inheritance as an implementation detail (with very high coupling.)

It is in 15.3 Handling an exception:

A handler is a match for an exception object of type E if

— The handler is of type cv T or cv T& and E and T are the same type (ignoring the top-level cv-qualifiers), or

— the handler is of type cv T or cv T& and T is an unambiguous public base class of E, or

— the handler is of type cv1 T* cv2 and E is a pointer type that can be converted to the type of the handler by either or both of - a standard pointer conversion (4.10) not involving conversions to pointers to private or protected or ambiguous classes — a qualification conversion

— the handler is a pointer or pointer to member type and E is std::nullptr_t.

(emphasis mine)

Sign up to request clarification or add additional context in comments.

Comments

3

Because private inheritance doesn't allow you to treat Derived*/Derived& as Base*/Base&. That means you cannot put Derived* where Base* is expected.

Actually private inheritance is used when you just want implementation of some class without accepting it's interface...

Comments

2

It's private inheritance, MyException is not convertible to std::runtime_error.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.