Доброго времени суток Никак не получается разобраться с одним примером
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ЗдравствуйтеЯ бы хотел задать вопрос по закрытому наследованию в C++
Как можно подключить файлы из одного проекта в другой в vs 2010?