简体   繁体   中英

The direct base class of private inheritance prevents the derived class from defining the object of the indirect base class

like this code

class Try
{
public:
    Try() = default;
    int i = 0;
};

class B1 : private Try
{
public:
    B1() = default;
    using Try::Try();
    using Try::i;
};

class C1 : public B1
{
public:
    Try a; //tell me:'Try' is a private member of 'Try'
    
    void print()
    {std::cout << i << std::endl;}
    //Access to this I is allowed;
};

the Try a is a local object, not a part of C1, why error?

As long as it is a direct base class of private inheritance, can it not be possible to define an indirect base class object in its derived class? Is it because the constructor cannot be used or is it for other reasons?

the Try a is a local object, not a part of C1, why error?

By writing Try a; in the context of class C1 , the name lookup will generally always scan from local to global scope. The first match thus will be B1::Try , which is, due to the private inheritance, inaccessible for C1 .

The fix is easy, just hint the compiler the name you "really" mean, ie by writing eg ::Try a; .

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