私有继承,朋友和异常处理

时间:2010-10-10 08:20:51

标签: c++ inheritance exception-handling friend

当A类私有地继承自B类时,它意味着B是A的私有基类子对象。但不是对于朋友,对于朋友而言,它是公共子对象。当有多个catch处理程序时,第一个匹配(即,如果异常类型可以隐式转换为处理程序的参数类型)被调用。那么有人会向我解释为什么下面的代码不能像我期望的那样工作吗?标准是出于此行为还是MSVC错误?

class A
{
};
class B:A //private inheritance 
{
    friend void g();
}; 

void f()
{

    B b;
    //A* pa = &b; // error, conversion exists, but is inaccessible
    throw b;
}

void g()
{
    B b;
    A* pa = &b; //ok, private inheritance, but g() is B's friend so it is as though public
    try
    {
        f();
    }
    catch(A&)
    {
        //WHY ISN'T THIS HANDLER INVOKED?! B&->A& conversion exists in this function
    }
    catch(B&)
    {       
    }
}

int main()
{
    g();
}

P.S。这不是真正的代码,这是一个理论上的实验,也就是说,不要告诉我像朋友那样糟糕的东西,而且构图优于私人继承等。

提前致谢

1 个答案:

答案 0 :(得分:4)

不,这不是标准所说的。它说(C ++ 0x):

  

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

     

- 处理程序的类型为cv T或cv T&   和E和T是相同的类型   (忽略顶级的cv-quali firs),   或

     

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

     

- 处理程序的类型为cv1 T * cv2   和E是可以的指针类型   转换为处理程序的类型   

之一或两者      

- 标准指针转换(4.10)   不涉及到指针的转换   私人或受保护的或含糊不清   课程

     

- 资格转换

     

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

理由:复杂的实施。你可以看一下这个转换发生在throw和catch之间,而不是g本身。