友元类与继承

 

C++ Primer中有如下描述:友元关系不能继承。基类的友元对派生类的成员没有特殊访问
权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

 然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。

注:有待通过g++编译器来验证。

1 友元类的继承问题

1.1 A类的友元B的派生类C 不能访问A类的private或protect成员变量。但可以通过B提供的接口来访问A。(废话肯定可以)

#include <iostream> 
using namespace   std; 
class B; 
class A 
{ 
	int a; 
public: 
	A(int x=0) { a=x; } 
	friend class B; 
}; 
class B 
{ 
	int b; 
public: 
	void fun(A& ob){ cout << ob.a << endl;} 
}; 

class C:public B
{ 
public: 
	//void fun2(A& ob){ cout <<ob.a <<endl;}   //派生类新加的函数却不能访问A,此句会报错
}; 

void   main() 
{ 
	A a(55); 
	C c; 
	c.fun(a); //C是B的派生类   通过基类B的函数fun仍然可以访问 
} 


1.2.  Base的友元可以通过Base的派生类Drived访问Base的private,protect成员变量,但不能访问Drived的private,protect成员变量。(这一点似乎与《C++ primer》里说的有点冲突)

个人理解:Drived的对象本身就包含Base,Base的友元Frnd自然就可以访问Base的部分。

#include <iostream> 
using namespace std; 
class Base 
{ 
	int m_a; 
public: 
	Base(int x=0){ m_a=x; } 
	friend class Frnd; 
}; 

class Drived:public Base 
{ 
private:
	int m_c;
public: 
	Drived(int x):Base(x){m_c=x;} 
};

class Frnd 
{
public: 
	void fun(Base& ob) { cout <<ob.m_a << endl; } 
	void fun2(Drived& ob) 
	{
		cout << ob.m_a<<endl;
		//cout <<ob.m_c<<endl; //编译错误
	} 
}; 

int main() 
{ 
	Drived d(1); 
	Frnd f; 
	f.fun(d); 
	f.fun2(d);
	system("pause");
	return 0;
} 

3 友元类的传递问题

A的友元是B,B的友元是C,那A的友元是C? 不是,友元类不具有传递性。



  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值