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的友元,同样要看类中是否有相应的申明。



贵圈真乱

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-08 22:12:23

C++中的友元——编程界的老王的相关文章

.Net中的并行编程-2.ConcurrentStack的实现与分析

在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现. 首先解释一下什么这里“无锁”的相关概念. 所谓无锁其实就是在普通栈的实现方式上使用了原子操作,原子操作的原理就是CPU在系统总线上设置一个信号,当其他线程对同一块内存进行访问时CPU监测到该信号存在会,然后当前线程会等待信号释放后才能对内存进行访问.原子操作都是由操作系统API实现底层由硬件支持,常用的操

[原创图书]《ActionScript3.0游戏中的图像编程》连载——前言

1946年,计算机在第三次工业革命的推动下得以诞生并发展.从此地球上多了一类人,他们的世界很简单,每天不是和0接触,就是跟1来往.他们低调做人,高调做事,他们务实为民,不求名利,他们,就是可爱可人,可歌可泣的IT工作者--程序员! 都说程序员不善表达,没错,离开0和1,程序员就几乎不会说话了.与此同时,程序员也恰恰是最善于表达的人,他们只用0和1这两个数字,就可以准确无误地将用户的需求传达给电脑并使其正确运行,其语言之简炼,其算法之精准,其逻辑之严谨,其结果之准确,试问除了程序员,还有谁可以做得

浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程【转】

本文转载自:http://www.cnblogs.com/qingchen1984/p/7007631.html 本篇文章主要介绍了"浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程",主要涉及到浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程方面的内容,对于浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程感兴趣的同学可以参考一下. 简介: 本文试图完整地描述 Linux 系统中 C 语言编程中的时间问

ActionScript3游戏中的图像编程(连载五十六,第3章完)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477 3.2.7 用冲破极限的数字打造图形纹理 Flash滤镜的参数虽然简单,但它们从各种几何规则的约束中解放了出来,比如模糊X可以不等于模糊Y,参数能容纳很大的数值,斜角的距离不再受大小的制约(当然Photoshop的阴影滤镜也如此),内外效果可以并存,等等,使Flash的滤镜返璞归真,重获自由,开发员和设计师都可随性地发挥个人的创造力,让艺术编程界百葩齐放. 图 3.95 简

ActionScript3游戏中的图像编程(连载四)

1.1 RGB模式,ARGB模式及其运算 1.1.1 RGB模式及其运算 RGB是色光三原色(Red红,Green绿,Blue蓝)的简写,物理学上,自然界的所有颜色都可以分解为这三种色光.不同的颜色,色光的值会有所差别.反过来,任何颜色都可以通过红绿蓝三种色光合成出来.白色把任何色光都反射出来了,所以它的红绿蓝成分都等于100%,黑色不反射任何色光,三原色的成分都等于0%.红色只反射红光,所以红色光等于100%,另外两种色光值为0%. 计算机软件习惯将色光称作“通道”,并将该概念扩展到其它的色彩

Python中的并发编程

简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态.打开文件列表.追踪指令执行情况的程序指针以及一个保存局部变量的调用栈.通常情况下,一个进程依照一个单序列控制流顺序执行,这个控制流被称为该进程的主线程.在任何给定的时刻,一个程序只做一件事情. 一个程序可以通过Python库函数中的os或subprocess模块创建新进程(例如os.fork()或是subprocess.Popen()).然而,这些被称为子进程的进程却是独立运行的,它们有各自独立的系统状态以及主线

.NET中的异步编程——动机和单元测试

背景 自.NET 4.5发布以来已经有很长一段时间了.留在了我们的记忆里,其发布在2012年8月15日.是的,六年前.感觉老了吗?好吧,我不打算让你做出改变,而是提醒你一些.NET发布的亮点.此版本带来的主要功能之一是使用async / await方法进行异步编程.基本上,微软的团队通过保持类似于同步代码的逻辑结构,使编译器完成开发人员过去经常做的工作. 你看,在那个时候,Windows Phone仍然是一件事情,为这些平台开发应用程序有一定的局限性.主要原因是Windows Phone与桌面应

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

[翻译]在 .NET Core 中的并发编程

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点.然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序的性能.在.NET Core中,任务 (tasks) 是并发编程的主要抽象表述,但还有其他支撑类可以使我们的工作更容易. 并发编程 - 异步 v