从std :: runtime_error私有继承的类不会被捕获为std :: exception

时间:2014-12-17 07:53:01

标签: c++ exception try-catch

这个例子中的所有内容

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;
   }
}

它写在stdout字符串&#34; catched ... &#34;。但是,如果我将继承更改为公共class MyException : public std::runtime_error,它会按预期工作(对我而言)并写入&#34; 捕获std异常:foo &#34;

c ++标准的哪一部分需要这样的行为?为什么?在什么情况下这种行为可能有用?

3 个答案:

答案 0 :(得分:3)

因为私有继承不允许您将Derived*/Derived&视为Base*/Base&。这意味着您无法将Derived*放在预期Base*的位置。

实际上,当你只想要实现某个类而不接受它的接口时,会使用私有继承...

答案 1 :(得分:3)

这很有意义,并且符合重载决策的规则。在MyException之外,您的班级不是 std::exception。您应该将私有继承视为实现细节(具有非常高的耦合。)

15.3处理异常

  

处理程序是E类型的异常对象的匹配,如果

     

- 处理程序的类型为cv T或cv T&amp;和E和T是相同的类型   (忽略顶级cv限定符)或

     

- 处理程序的类型为cv   T或cv T&amp;和T是 明确的公共基类E ,或

     

- 处理程序的类型为cv1 T * cv2,E是可以的指针类型   通过标准中的一个或两个转换为处理程序的类型   指针转换(4.10)不涉及到指针的转换   私人或受保护或模棱两可的课程     - 资格转换

     

- 处理程序是指向成员类型的指针或指针,E是std :: nullptr_t。

(强调我的)

答案 2 :(得分:1)

这是私有继承,MyException无法转换为std::runtime_error