Преобразование к базовому классу

300
19 декабря 2016, 19:53

Доброго времени суток Никак не получается разобраться с одним примером

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 влияет на это и вообще, как в такой ситуации компилятор определяет, доступно преобразование или нет?

С уважением, Виктор

Answer 1
  • В строке 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

READ ALSO
Закрытое наследование в C++

Закрытое наследование в C++

ЗдравствуйтеЯ бы хотел задать вопрос по закрытому наследованию в C++

292
Простой пример с одним нейроном.

Простой пример с одним нейроном.

Нужен простейший пример с реализацией:

292
Подключение проекта в проект в Visual Studio

Подключение проекта в проект в Visual Studio

Как можно подключить файлы из одного проекта в другой в vs 2010?

319