简体   繁体   中英

Accessing public static members of a base class specified as private

I'm learning C++. The documentation docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp says:

When you specify a base class as private, it affects only nonstatic members. Public static members are still accessible in the derived classes.

However, the following code slightly adjusted from the example following the previous quote cause error C2247:

'Base::y' not accessible because 'Derived1' uses 'private' to inherit from 'Base'.

I will appreciate any help with this situation.

class Base
{
public:
    int x;             
    static int y;      
};

class Derived1 : private Base
{
};

class Derived2 : public Derived1
{
public:
    int ShowCount();    
};

int Derived2::ShowCount()
{
    int cCount = Base::y;       
    return cCount;
}

That documentation is a little misleading.

The correct compiler behaviour is for Base::y and Base::x to both be inaccessible in Derived , if you use that notation to attempt to reach the static member.

But you can reach it via the global namespace (thereby circumventing Derived1 ) by using another scope resolution operator:

int Derived2::ShowCount()
{
    int cCount = ::Base::y;       
    return cCount;
}

Finally, don't forget to define y somewhere if you want the link stage to be successful.

Change this:

Base::y;

to this;

::Base::y;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM