友元函数给程序员提供了对类的特殊访问权限,使得这个友元函数可以直接访问该类的全部成员(具有和成员函数一个级别的访问权限)。
注意:友元函数的访问权限不仅是可以访问该友元全部成员,甚至还可以访问该类的派生类和友元相同的一部分。
友元类声明:
class Base
{
friend class Derive2;
protected:
int b_1;
};
定义基类派生类:
class Derive1:public Base
{
protected:
int D_1;
};
友元类定义:
class Derive2
{
public:
void f1(Base b) { b.b_1; } // 1
void f2(Derive1 _1) { _1.D_1; } // 2
void f3(Derive1 _1) { _1.b_1; } // 3
};
讲解:第一行由于是友元,可以直接访问protected成员(private成员类似)
第二行由于友元不具有传递性,即每一个类都控制着各自的访问权限。所以报错报错信息为:“Derive1::D_1”: 无法访问 protected 成员(在“Derive1”类中声明)
第二行即上面注意的例子,可以访问派生类和基类共有的一部分.
/**********************************************************************************************************/
下面讨论using 关键字使用:
using 不仅是每次写代码声明中 using namespace std;的使用。在c++11中,赋予了更广阔权限。
它可以将派生类从基类继承的成员修改权限。新的权限由派生类中的声明位置权限所定.。
注意:只可以修改派生类可以访问的权限!!!!!
基类声明:
class Base
{
public:
int x_public;
int f1() { return 1; }
protected:
int x_protected;
int f2() { return 2; }
private:
int x_private;
int f3() { return 3; }
};
派生类定义:
class Derive:public Base
{
protected:
//修改为protected权限
using Base::x_public;
using Base::f1;
public:
//修改为public访问权限
using Base::x_protected;
using Base::f2;
//错误!!不可以修改派生类不可以访问的元素权限
using Base::x_private;
using Base::f3;
};
/********************************************************************************************************/
struct 和 class 区别只有默认的访问权限,和默认继承方式不同,struct 是public 而 class 是private