Доброго времени суток Никак не получается разобраться с одним примером
void fnc();
class CLASS1
{
public:
int r;
};
class CLASS2 : private CLASS1
{
friend void fnc();
};
class CLASS3 : public CLASS2
{
};
void fnc()
{
CLASS3 cl3;
CLASS1 cl1;
cl1 = cl3;
}
int main()
{}
Ошибок компиляции на VS2008 здесь никаких нет, однако если CLASS3 будет наследоваться не как public, а как protected, появляется ошибка, что преобразование недоступно. Убрать friend - тоже недоступно. В книге Липпмана написано, что оно доступно, если можно обратиться к public полю класса, в который идет преобразование, однако в CLASS3 базовый класс (CLASS1) недоступен (т.к. CLASS2 наследует private), а преобразование есть. Как friend влияет на это и вообще, как в такой ситуации компилятор определяет, доступно преобразование или нет?
С уважением, Виктор
cl1 = cl3 у вас выполняется вызов оператора присваивания.Поскольку для CLASS1 компилятор автоматически сгенерировал оператор присваивания, принимающий аргумент типа const CLASS1 &, то в вашем примере строка cl1 = cl3 приводит к вызову CLASS1::operator=(const CLASS1 &).
CLASS3 в вызов CLASS1::operator=(const CLASS1 &).Поскольку этот вызов происходит в пределах функции fnc, которая помечена как friend в классе CLASS2, то вся цепочка преобразований типов CLASS3 -> CLASS2 -> CLASS1 доступна в пределах этой функции.
Соответственно, осуществимо преобразование 'const CLASS3 & -> const CLASS1 &', поэтому этот код не приводит к ошибке компиляции.
См. также http://stackoverflow.com/questions/5128908/c-type-conversion-faq
Продвижение своими сайтами как стратегия роста и независимости