class意味着封装,而friend则是对封装的破坏,两者合理组合有很多意想不到的效果。
例如,有class A,class B。如何不在A内使用friend,而使B访问A的成员(准确的说是受保护的成员)
如下代码:
class A
{
protected:
int number;
};
class B
{
class SubA : public A //构造一个A的子类,该子类不含自有数据成员
{
friend class B;//仅仅声明友元类即可
};
public:
void Test(A &a)
{
SubA *sa=(SubA *)(&a); //转换为SubA
sa->number=100;//修改A的成员
}
};
class B 通过class A的子类SubA间接实现了对A的友元。
class SubA继承class A,且SubA不含自有数据成员,所以A和很安全的转换为SubA。同时,SubA声明在class B内,SubA仅在class B可见。