fbr*_*eto 12 c++ inheritance private exception private-inheritance
鉴于此示例代码:
#include <iostream>
#include <stdexcept>
class my_exception_t : std::exception
{
public:
    explicit my_exception_t()
    { }
    virtual const char* what() const throw()
    { return "Hello, world!"; }
};
int main()
{
    try
        { throw my_exception_t(); }
    catch (const std::exception& error)
        { std::cerr << "Exception: " << error.what() << std::endl; }
    catch (...)
        { std::cerr << "Exception: unknown" << std::endl; }
    return 0;
}
我得到以下输出:
Exception: unknown
然而,简单地使继承my_exception_t的std::exception public,我得到下面的输出:
Exception: Hello, world!
有人可以向我解释为什么继承类型在这种情况下很重要吗?奖励积分作为标准中的参考.
GMa*_*ckG 21
当您私下继承时,您无法转换为或以其他方式访问该类之外的基类.既然你要求标准的东西:
§11.2/ 4:
如果可以访问基类的发明公共成员,则可以访问基类.如果可以访问基类,则可以隐式地将指向派生类的指针转换为指向该基类的指针(4.10,4.11).
简单地说,对于课外的任何东西,它就像你从未继承过std::exception,因为它是私人的.因此,它不会被std::exception&条款捕获,因为不存在转换.
Bri*_*ndy 10
有人可以向我解释为什么继承类型在这种情况下很重要吗?奖励积分作为标准中的参考.
继承的类型无关紧要.只有您可以使用其中一种捕获类型的可访问转换.事实上,由于它不是公共继承,因此没有公共可访问的转换.
说明:
您可以在此处看到相同的行为:
class B
{
};
class C1 : B
{
};
class C2 : public B
{
};
int main(int argc, char** argv)
{
    B& b1 = C1();//Compiling error due to conversion exists but is inaccessible
    B& b2 = C2();//OK
    return 0;
}
如果出现以下情况,则抛出的异常仅由catch块捕获:
| 归档时间: | 
 | 
| 查看次数: | 8492 次 | 
| 最近记录: |