Нет, дружба в C ++ не транзитивна.
Из стандарта C ++ 03, 11.4-8:
Дружба не является ни наследственной, ни переходной. Пример:
class A {
friend class B;
int a;
};
class B {
friend class C;
};
class C {
void f(A* p)
{
p->a++;
// error: C is not a friend of A
// despite being a friend of a friend
}
};
class D : public B {
void f(A* p)
{
p->a++;
// error: D is not a friend of A
// despite being derived from a friend
}
};