личное наследование, друзья и обработка исключений - PullRequest
4 голосов
/ 10 октября 2010

Когда класс А в частном порядке наследуется от класса 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. Это НЕ настоящий код, это теоретический эксперимент, то есть не говорите мне, что друзья плохие, а композиция превосходит частное наследование и т. Д.

Заранее спасибо

1 Ответ

4 голосов
/ 10 октября 2010

Нет, это не то, что говорит стандарт. Он говорит (C ++ 0x):

Обработчик соответствует исключению объект типа E, если

- Обработчик типа cv T или cv T & и E и T одного типа (игнорируя cv-квалификаторы верхнего уровня), или

- обработчик типа cv T или cv T & и T является однозначной общественной базой класс Е или

- обработчик типа cv1 T * cv2 и E является типом указателя, который может быть преобразован в тип обработчика по одному или обоим из

- стандартное преобразование указателя (4.10) без учета преобразования в указатели частным или защищенным или неоднозначным занятия

- квалификационное преобразование

- обработчик является указателем или указателем на тип члена и E является std :: nullptr_t

Обоснование: сложная реализация. Вы можете посмотреть на это так, будто преобразование происходит где-то между броском и уловом, а не в самом g.

...