zoukankan      html  css  js  c++  java
  • [转]深入浅出C++之private/public/protected

    转载地址:http://blog.csdn.net/xushiweizh/archive/2006/11/06/1370337.aspx

    下面这个问题摘自论坛的一个帖子

    已知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护的方法F3:类P和类Q是类O的派生类,其继承方式如下所示:
    class P : protected O {…};
    class Q : public O {…};
    关于方法F1的描述中正确的是___(34)___;关于方法F2韵描述中正确的是___(35)___;关于方法F3的描述中正确的是___(36)___。
    (34)
    A.方法F1无法被访问
    B.只有在类O内才能访问方法F1
    C.只有在类P内才能访问方法F1
    D.只有在类Q内才能访问方法F1
    (35)
    A.类O、P和Q的对象都可以访问方法F2
    B.类P和Q的对象都可以访问方法F2
    C.类0和Q的对象都可以访问方法F2
     D.只有在类P内才能访问方法F2
    (36)A.类0、P和Q的对象都可以访问方法F3
    B.类0、P和Q的对象都不可以访问方法F3
    C.类0和Q的对象都可以访问方法F3
    D.类P和Q的对象都可以访问方法F3。

    有甚么办法可以简单地记住这许多的规则? 下文告诉你一个根本不需要记的办法。

    顾名思义,private/public/protected 分别表示 私有/公开/保护,它们是一组用于访问权限控制的关键字。那么首先,需要澄清的一个关键点是,是要控制谁访问谁的权限?这个访问的主语(施事)是谁?宾语(受事)是谁?

    我们经常听到这样的说法:

    1)一个类友元可以访问该类的任何成员(包括成员变量及成员方法,下同)。
    2)private成员只有该类自身可以访问,protected成员只有该类及其派生类可以访问,public成员所有的人都可以访问。

    宾语(受事)是谁这一点很明确,是类的成员(包括成员变量及成员方法)。主语(施事)是谁?这是让大家发生混淆的关键点。也是这个说法中含糊不清的地方。

    想清楚一点,其实主语(施事)指的是一个函数,而不是(当然更不是变量)。private/public/protected要控制的是一个函数(施事)对一个类的成员(包括成员变量及成员方法)的访问权限。因此比较完整的说法是:

    1)一个类友元(包含友元函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。

    2)除去友元外,private成员只有该类自身的成员函数可以访问,protected成员只有该类的成员函数及其派生类的成员函数可以访问,public成员则所有的函数都可以访问。

    也就是说,当我们说一个类可以访问XXX,其实暗指这个类的成员函数可以访问XXX。了解了这一点,外加一条显而易见的规则,上面的问题就不难回答了。这条规则是:

    3)派生类在继承时可削弱成员的访问权限(通过protected/private修饰)。例如上面的例子class P : protected O {…}; 那么某个函数通过类P访问O中成员时,该函数对类O中的public成员只有protected权限。

    补充:有一种技术叫Member Spy(类成员间谍),通过该技术派生类可将基类的protected成员修改为public权限。这种技术用到了using关键字。举例如下:

    class A
    {
    protected:
     int m_data;
    };

    class SpyA : public A
    {
    public:
     using A::m_data;
    };

    void TestSpy(A* pA)
    {
     SpyA* pSpyA = static_cast<SpyA*>(pA);
     // 强制转换A为SpyA,这要求SpyA没有成员变量且没有重载A中的虚函数。
     // 现在你可以通过pSpyA访问m_data了。例如:int data = pSpyA->m_data;
    }

    由于这种技术用到了强制类型转换,当谨慎使用。

  • 相关阅读:
    python内置模块argparse的使用
    pyqt5中通过pycharm配置designer(win和mac都适用,修改下designer目录路径即可)
    初始pyqt5
    pyqt5学习示例
    python中partial用法
    python中操作csv
    python模块imghdr-----推测图像类型
    portainer docker可视化工具
    靠着这份面试手册成功斩获99家BAT大厂offer
    redis事物有一致性吗?
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1133702.html
Copyright © 2011-2022 走看看