Когда класс А в частном порядке наследуется от класса B, это означает, что B является частным субобъектом базового класса A. Но не для друзей, для друзей это публичный субобъект. И когда есть несколько обработчиков перехвата, вызывается первый соответствующий (то есть, если тип исключения может быть неявно преобразован в тип параметра обработчика). Так кто-нибудь объяснит мне, почему следующий код не работает так, как я ожидаю? Это поведение предусмотрено стандартом или это ошибка 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. Это НЕ настоящий код, это теоретический эксперимент, то есть не говорите мне, что друзья плохие, а композиция превосходит частное наследование и т. Д.
Заранее спасибо