C++中的友元——编程界的老王

c++中友元类可以访问类的所有域,简直是编程世界的老王。

老王可以得知邻居李的名字,户籍,甚至是 *wife**

但是老王却不一定知道邻居李的儿子的亲生父亲。

老王的儿子,可以通过老王得知邻居李叔的八卦新闻。

但是老王的儿子和老王一样,并不能知道邻居李叔儿子的亲生父亲。

#include <iostream>
using namespace std;

class Li
{
    friend class LaoWang;
public:
    Li(): name(1), m_home(2), m_wife(3) {}
    ~Li(){ }

public:
    int name;
protected:
    int m_home;
private:
    int m_wife;
};

class LiSon: public Li
{
public:
    LiSon():trueFather(4){}
private:
    int trueFather;
};

class LaoWang
{
public:
    virtual void look(const Li& li) {
        cout << "LaoWang know Li's "
             << endl;
        cout << "name: " << li.name
             << " home: " << li.m_home
             << " wife: " << li.m_wife
             << "." << endl;
    }
};

class LaoWangSon: public LaoWang
{
public:
    void look(const Li& uncleLi) {
        //! cout << "name: " << uncleLi.name << " home: " << uncleLi.m_home << " wife: " << uncleLi.m_wife<< endl;
        cout << "LaoWang's son know" << endl;
        this->LaoWang::look(uncleLi);
    }

};

int main(int, char**)
{
    Li li;
    LaoWang laoWang;

    laoWang.look(li);
    cout << "========" << endl;

    LaoWangSon laoWangSon;
    laoWangSon.look(li);
    cout << "========" << endl;

    cout << "LaoWang only know LiSon's father's ." << endl;
    LiSon liSon;
    laoWang.look(liSon);

    cout << "========"
         << "oh! the firend mean the LaoWang."
         << endl;

    return 0;
}

使用友元类时注意:
* 友元关系不能被继承。
* 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
* 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。


贵圈真乱

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值