这个例子中的所有内容
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 ++标准的哪一部分需要这样的行为?为什么?在什么情况下这种行为可能有用?
答案 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
。