LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 155|回复: 0

访问控制和静态成员

[复制链接]
发表于 2024-2-2 23:11:14 | 显示全部楼层 |阅读模式
在将基类指定为 private 时,它只影响非静态成员。 在派生类中,公共静态成员仍是可访问的。 但是,使用指针、引用或对象访问基类的成员需要转换,此时将再次应用访问控制。 请考虑以下示例:

// access_control.cpp
class Base
{
public:
    int Print();             // Nonstatic member.
    static int CountOf();    // Static member.
};

// Derived1 declares Base as a private base class.
class Derived1 : private Base
{
};

// Derived2 declares Derived1 as a public base class.
class Derived2 : public Derived1
{
    int ShowCount();    // Nonstatic member.
};

// Define ShowCount function for Derived2.
int Derived2::ShowCount()
{
    // Call static member function CountOf explicitly.
    int cCount = ::Base::CountOf();     // OK.

    // Call static member function CountOf using pointer.
    cCount = this->CountOf();  // C2247: 'Base::CountOf'
                               // not accessible because
                               // 'Derived1' uses 'private'
                               // to inherit from 'Base'
    return cCount;
}
在前面的代码中,访问控制禁止从指向 Derived2 的指针转换为指向 Base 的指针。 this 指针是 Derived2 * 类型的隐式表示形式。 若要选择 CountOf 函数,必须将 this 转换为 Base * 类型。 不允许执行此类转换,因为 Base 是 Derived2 的 private 间接基类。 到 private 基类类型的转换只适用于指向立即派生类的指针。 这就是为什么可以将 Derived1 * 类型的指针转换为 Base * 类型。

显式调用 CountOf 函数,而不使用指针、引用或对象来选择它,意味着没有转换。 这就是允许调用的原因。

派生类 T 的成员和友元可以将指向 T 的指针转换为指向 T 的 private 直接基类的指针。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表