精华内容
下载资源
问答
  • 友元关系与继承

    2013-05-19 12:52:03
    像其他类一样,基类或派生类可以使其他类或函数...如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。  每个类控制对自己的成员的友元关系 class Base { friend cl

          像其他类一样,基类或派生类可以使其他类或函数成为友元(12.5节)。友元可以访问类的private和protected数据。

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

          每个类控制对自己的成员的友元关系

    class Base
    {
    	friend class Frnd;
    protected:
    	int i;
    };
    class D1:public Base
    {
    protected:
    	int j;
    };
    //Frnd has no access to mebers in D1
    class Frnd
    {
    public:
    	int mem(Base b){return b.i;} //ok:Frnd is friend to Base
    	int mem(D1 d){return d.j;}   //error:friendship doesn't inherit
    };
    //D2 has no access to members in Base
    class D2:public Frnd
    {
    public:
    	int mem(Base b){return b.i;}  //eroor:friendship doesn't  inherit
    };


     


    如果派生类想要将自己成员的访问权授予其基类的友元,派生类必须显式地这样做:基类的友元对从该基类派生的类型没有特殊访问权限。同样,如果基类和派生类都需要访问另一个类,那个类必须特地将访问权限授予基类和每一个派生类。

    展开全文
  • 友元关系和继承

    千次阅读 2013-12-09 19:57:20
    问题:在c++primer(中文第四版)第15.2.6...则只有基类具有特殊的访问权限,该基类的派生类不能访问授予友元关系的类。 很精炼,就是理解起来有点晦涩。还好作者提供了例子程序做注解,更可贵的是这个例子是错的,才没让

    问题:在c++primer(中文第四版)第15.2.6节,讲了友元关系在类继承上的有效性,其中注解部分强调:

           (1)友元关系不能继承。(2)基类的友元对派生类的成员没有特殊的访问权限。(3)如果基类被授予友元关系,

    则只有基类具有特殊的访问权限,该基类的派生类不能访问授予友元关系的类。

    很精炼,就是理解起来有点晦涩。还好作者提供了例子程序做注解,更可贵的是这个例子是错的,才没让有心的读者稀里糊涂的接受。

       例子:

    class Base{
    	friend class Frnd;
    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;}//i is inherent from BASE, it's ok.书上为error
    	                          //d.j is not allowed.
    };
    class D2:public Frnd{ //D2 isn't BASE's friend, though it inherent from Frnd.
    	int mem(Base b){ return b.i; }
    };
    红色部分书上认为是错误的,但在实际的环境中却是正确的(在vs2012),有些读者认为是书刊的笔误,应该是d.j,如紫色部分。

    对正确与否暂且不论,这个例子对我们更好的理解前面的三句话有很大的帮助。逐一理解:

    第一句:(1)友元关系不能继承。

    这句话包含了两层含义,我们来举两个现实中的情节说明。

    1)张三结交甚广,对朋友更是慷慨至极,生前有一些财产,在没被儿子继承前,通过设定friend,让发小李四共享,现在张三的儿子继承了

    张三的财产A,加上自己的勤劳,又有了自己的新的一部分财产B,某天,李四要访问张三与其共享的财产,张三的儿子不允许(书上标示为error的部分), 李四很生气,暴脾气上来连抽了张三儿子几个耳光,愤愤道:“娘的老子又没用你的,老子用的是你老子的。” 张三的儿子无奈,只能心中一万匹草泥马掠过。谁知又过了几天,李四又要打张三儿子财产B的注意,张三儿子那个乐啊,pia pia 还了几个耳光,欣然道:“这是老子自己的,去你nnd。”

         

        故事告一段落,以书中的例子作为解说,第一句的意思是Base与Frnd的友元关系没有被D1继承,所以除了D1从Base继承的部分,Frnd是不能访问的, 除非张三的儿子很尊 敬这个叔叔,显式的与李四建立friend关系。即第二句所言。


    2)李四的儿子继承了老爹,成功上位,李四这老爷子走之前告诉儿子说你张三叔那还有部分他俩共享的财产,要儿子时常照看,没事去转转,别被张三儿子独吞了,李四儿子喜极,放下马褂径直奔去,结果被张三儿子家的下人一顿暴打,更被张三儿子辱骂一番:娘的,比你爹还没出息,你老子来也就算了,你算什么东西,我老子当年跟你有friend契约吗?李四儿子灰脸泪奔而去。

         


         故事结束,以书中的例子解说,D2继承了Frnd,但Frnd和Base的friend关系是他们那代人的关系,是不能被继承的,是断代的。即第三句所言。


    第二句中的“派生类的成员”,指派生类独有的,非从父类继承的部分。

    第三句在故事中讲清楚了。

    最后,学习知识是严肃、严谨的事情,若发现其中理解偏差或错误的部分,请不吝赐教,拜谢。(csdn编辑真不太好用闭嘴)

    展开全文
  • c++ 友元关系与继承

    2013-02-25 20:48:00
    如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。 class Base { friend class frnd; protected: int i; } // Frnd has no access to members in D1 ...

    友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。

    如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

    class Base
    {
        friend class frnd;
    protected:
        int i;
    }
    
    // Frnd has no access to members in D1
    class D1 : public Base
    {
    protected:
        int j;
    };
    
    class Frnd
    {
    public:
        int mem(Base b) { return b.i; } // ok: Frnd is friend to Base
        int mem(D1 d) { return d.i; } // error: friendship doesn’t inherit
    };
    
    // D2 has no access to members in Base
    class D2 : public Frnd
    {
    public:
        int mem(Base b) { return b.i; } // error: friendship doesn’t inherit
    };

     

     

    展开全文
  • 30.1 全局函数作为友元函数 全局函数本身只具有公共权限,无法访问私有属性将全局函数友元化,可以访问类中的私有属性友元语法: friend + 全局函数声明 // 放入类的最上方****************************************...

    30.1 全局函数作为友元函数

    全局函数本身只具有公共权限,无法访问私有属性
    将全局函数友元化,可以访问类中的私有属性
    友元语法: friend + 全局函数声明 // 放入类的最上方
    ****************************************************************************************
    #define _CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    #include// 全局函数作为友元函数:使全局函数可以访问类中的私有属性
    class Buliding
    {
    friend void GoodGay(Buliding &buliding); // 全局函数友元化
    public:
    Buliding() // 默认构造函数: 初始化成员变量
    {
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
    }
    string m_SittingRoom; // 客厅: 公共属性
    private:
    string m_BedRoom; // 卧室: /私有属性
    };------------------------------------------------------------------------------------------
    void GoodGay(Buliding &buliding) //全局函数
    {
    cout << "好基友正在访问: " << buliding.m_SittingRoom << endl; // 访问公共属性 -- OK
    // cout << "好基友正在访问: " << buliding.m_BedRoom << endl; //访问私有属性 -- err// 解决:将全局函数友元化
    // 用法: friend + 全局函数声明 然后放入类的最上方

    cout << "好基友正在访问: " << buliding.m_BedRoom << endl; // 友元后就可以了
    }
    int main()
    {
    Buliding b;
    GoodGay(b);
    system("pause");
    return EXIT_SUCCESS;
    }

    30.2 类作为友元类
    #define _CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    #include
    class Building
    {
    friend class GoodGay; // 友元类的声明
    public:
    Building() // 默认构造函数
    {
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
    }
    public:
    string m_SittingRoom; // 公共属性: 客厅
    private:
    string m_BedRoom; // 私用属性: 卧室
    };------------------------------------------------------------------------------------------
    class GoodGay
    {
    public:
    GoodGay() {
    building = new Building; // 默认构造初始化 被友元类的指针
    }
    void visit()
    {
    cout << this->building->m_SittingRoom << endl;
    // Building类对象指针是GoodGay的成员变量,因此可以访问Building类的共有属性变量
    // cout << this->building->m_BedRoom << endl; //如果未设置友元类, err: m_BedRoom不可访问//解决方式:将 GoodGay 作为 Building 的友元类,可以访问 Building 中是私有属性
    cout << this->building->m_BedRoom << endl;
    }
    private:
    Building * building; // 维护着 被友元类的指针
    };
    void test()
    {
    GoodGay gg;
    gg.visit();
    }

    int main()
    {
    test();
    system("pause");
    return EXIT_SUCCESS;
    }// 注意:
    // 友元关系不能被继承
    // 友元类是单向的: 类A是类B的友元类,则类A可以访问类B中的私有属性,但类B不一定是类A的友元类
    // 友元类不具有传递性: 类 A 是类 B 的友元类,类 B 是类 C 的友元类,类 A 不一定是类 C 的友元类

    d894968257cb9d5f15dcc0fb21bf80b3.png
    展开全文
  • 基类的友元对派生类的成员没有特殊访问权限,如果基类被授予友元关系,则只有基类具有特殊的访问权限,该基类的派生类不能访问授予友元关系的类; 3、如果派生类想要将自己成员的访问权限授予基类的友元,则必须...
  • 友元

    2019-11-24 21:41:14
    序言 这章主要是讲解C++中友元,其中友元包括友元函数与友元类。它的主要作用是可以访问类中已隐藏或者封闭的私有...(3) 友元关系具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看...
  • 友元

    2019-08-19 15:52:14
    (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3) 友元关系具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中...
  • 友元,顾名思义,是某个类的“朋友”。这个朋友角色的特殊之处在于它可以访问类中所有的成员,包括私有、保护和公有的成员函数和成员变量。...友元的使用情况具有特殊性,所以所有的友元关系都是单方面的,
  • 友元函数

    2020-05-06 21:27:10
    友元就是提供了一种机制使得非类中的成员也能访问类中私有的函数 我们可以这样来理解 友元相当于我的好朋友,友元类相当于好朋友那一家。 下面我们有好朋友的这个思路来理解一下...友元关系具有传递性 也就是说C是...
  • C++: 友元函数和友元类详解

    千次阅读 2016-07-17 22:40:42
    (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3) 友元关系具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中...
  • 关于友元继承

    2019-06-22 15:38:42
    关于友元继承 友元能够是个函数,该函数被称为友元函数;友元也能够是个类,该类被称为友元类。 在C++中,自定义函数可以充当友元,友元只是能访问指定类的私有和保护成员的自定义函数,不是被...(3) 友元关系具有...
  • 5 友元

    2017-07-24 10:23:00
    类A是类B的友元,类C是类A的公有派生类,忽略特殊情况下,下列说法正确的:BD A 类B是类A友元 B 类C不是类B友元 C 类C是类B友元 ...(3) 友元关系具有传递性。若类B是类A的友元,类C是B的友元,类C...
  • C++ 友元

    2013-08-12 09:09:06
    1. 什么时候用友元类?  当希望一个类可以存取另一个类的私有成员时,可将该类声明为另一个类的友元类; 2. 友元类作用?  友元类的所有方法都是另一个类的友元函数,友元类可以访问另一个类的...3)友元关系具有
  • C++友元简单说明

    2019-09-23 17:06:07
    关于友元通常情况下访问一个类中的私有成员必须调用其类的成员函数进行访问但如果在类中声明一个友元函数,类外定义时...注意:(1)友元关系不能被继承(2)友元关系是单向的不具有交换性(3)同样友元关系具有传...
  • 友元类与继承

    千次阅读 2014-05-15 06:24:03
    C++ Primer中有如下描述:...如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。  然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

友元关系具有