基类的友元函数不能被派生类继承。但是当派生类是通过公有继承方式派生时,默认地通过强制类型转换,可以将派生类转换为基类,从而调用友元函数。证明了派生类与基类是 is -a 的关系。但是,如果派生类是通过私有继承时,则不能够调用基类的友元函数。

 

友元关系不能继承。
1.       基类的友元对派生类的成员没有特殊访问权限。
2.       如果基类被授予友元,则只有基类具有特殊访问权限,该基类的派生类无特殊访问权限;
3.       但该基类没有被派生类重写且有特殊访问的成员函数仍能被派生类对象直接调用。

 


#include <iostream>
using namespace std;
class CBase
{
private:
int x,y;
public:
CBase( int a=0,int b = 0 ):x(a),y(b){}
friend ostream& operator << ( ostream& os,const CBase& c );
};

ostream& operator << ( ostream& os ,const CBase& c )
{
os<<c.x<<" "<<c.y;
return os;
}

class CDev: public CBase
{
public:
int z;
CDev(int a,int b ):CBase(a,b),z(0){}
};


class Base{
private:
int nData_base;
friend class Friend_base;
public:
Base():nData_base(2){}
};

class Derived:public Base{
private:
int nData_derive;
};

class Friend_base{
public:
void try1(Base &b){
cout<<b.nData_base<<endl; // OK
}

void try2(Base &b){
cout<<b.nData_base<<endl;// OK
}

// void try3(Derived &d){
// cout<<d.nData_derive<<end; // ERROR 原因:1
// }
};


class Friend_derived:public Friend_base{
public:
//void try1(Base &b){
// cout<<b.nData_base<<endl; // ERROR 原因:2
//}
//void fun(Base &b){
// cout<<b.nData_base<<endl; //ERROR 原因:2
//}
};

int main()
{
CBase c(4,5);
cout<<c<<endl;

CDev d(2,3);
cout<<d<<endl;

cout<<"测试友元类的继承"<<endl;
Base b;
Friend_derived f;
f.try2(b); // OK 原因:3
system("pause");
}

 

posted on 2012-06-14 11:15  wox  阅读(558)  评论(0)    收藏  举报