woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

基类、派生类与友元

1. 某基类为另一类的友元,该基类的派生类是否为其友元

答:否

class Base
{};

class Derived : public Base
{};

class SomeClass
{
     int _i;
public:
     friend class Base;    //
是否Derived也是类SomeClass的友元

}


---------------------------------------------------------------

不可以:例子见下

#include <iostream>

using namespace std;

class Base;

class SomeClass
{
     int _i;
public:
void prnt() { cout << "_i = " << _i << endl;}
SomeClass() : _i(0) {}
     friend class Base;    //
是否Derived也是类SomeClass的友元:

};

class Base
{
public:
SomeClass one;
void foo()
{
one._i = 123;
}
};
//*
class Derived : public Base
{
public:
SomeClass two;
void foo()
{
SomeClass two;
two._i =789;   //
编译在此出错

}
};
//*/

void main()
{
Base b;
b.one.prnt();
b.foo();
b.one.prnt();
/*
Derive d;
d.two.prnt();
d.foo();
some.prnt();
//*/
}


这样做显然是为了安全,避免被恶意突破对对象的封装,以便一切尽在控制之中

--------------------------------------------------------------- ---------------------------

2.基类的友元对从该基类派生的类型没有特殊访问权限。

如果基类和派生类都需要访问另一个类,那个类必须特地将访问权限授予基类和每一个派生类

#include<iostream>
using namespace std;

class Base{
friend class Frnd;
//friend class D2;
protected:
int i;
};

class D1:public Base{
protected:
int j;
};

class Frnd{
public:
int mem(Base b){return b.i;}
//int mem(D1 d){return d.i;}//
错误,基类友元对其派生类无作用

};

class D2: public Frnd{
public:
int mem(Base b){return b.i;}//
错误,友元的派生类也不可以....,想访问,必须定义friend

};


void main()
{

}

3.派生类的友元可以访问基类

#include<iostream>
using namespace std;

class Base{
public:

protected:
int i;

};

class D1:public Base{
private:
int j;
friend class Frnd;
};

class Frnd{
public:
//int mem(Base& b){return b.i;}//
错误,这是Base的引用,Frnd D1的友元但不是Base
int mem(D1 &d){return d.i;}//
正确,D1的引用,友元定义于D1,就像其成员函数一样可访问基类
};

void main()
{


}

 

 

posted on 2009-10-27 11:20 肥仔 阅读(840) 评论(0)  编辑 收藏 引用 所属分类: C++ 基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理