Частное наследование по иерархии классов, зачем нужен друг по всей иерархии - PullRequest
0 голосов
/ 12 февраля 2019

Рассмотрим следующий код:

#include <iostream>

class A{
    friend class C;
    int a{42};
};

class B: private A{
    friend class C;
};

class C: private B {
public:
    void print() {std::cout << a << '\n';}
};

int main() {
    C c;
    c.print();
}

Согласно этому ответу , переменная-член A::a присутствует во всех классах, но ее видимость отличается, т.е.видимый в B или C, если мы не сделаем B или C другом A.У меня вопрос, почему я должен сделать C другом и A и B?Хотелось бы, чтобы декларация друга в A была бы достаточной.Если я удаляю объявление friend class C; из A или B, код не компилируется.

1 Ответ

0 голосов
/ 12 февраля 2019

Мой вопрос: почему мне нужно сделать так, чтобы C дружил с и A, и с B?

Без B объявление C имеет друга, C не смотри B как наследующее A.Даже если C будет видеть A::a, он не будет видеть B::a.

Действительно:

  • C наследует B, поэтому все public в B доступно из C.
  • Но B наследует в частном порядке из A.C друг B делает C см. это наследство.
  • Доступ к A::a является частным, так что даже если C видит A как его предок, он должен быть другом от A до см. A::a.
...