简体   繁体   中英

Does protected inheritance allow the derived class access the private members of its base class?

I am really confused about private inheritance and protected inheritance.

1) in protected inheritance, the public and protected members become protected members in the derived class. In the private inheritance, everything is private. However, the derived class can never access the private members of the base class, is that right? The derived class can access the public and protected members in both cases. Is that right?

2) I noticed that the private members of the base class will never be touched by the derived class. So why are the private members inherited?

You are correct on point #1. Specifying private , protected or public when inheriting from a base class does not change anything access-wise on the derived class itself. Those access specifiers tell the compiler how to treat the base-class members when instances of the derived class are used elsewhere, or if the derived class happens to be used as a base class for other classes.

UPDATE: The following may help to illustrate the differences:

class Base
{
    private:   int base_pri;
    protected: int base_pro;
    public:    int base_pub;
};

For classes derived from base:

class With_Private_Base :   private Base   { void memberFn(); };
class With_Protected_Base : protected Base { void memberFn(); };
class With_Public_Base :    public Base    { void memberFn(); };

// this would be the same for all of the above 3 classes:
void With_PXXX_Base::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

For classes derived from the 3 derived classes:

class A : public With_Private_Base { void memberFn(); }
void A::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // error: `int Base::base_pro' is protected
    base_pub = 1; // error: `int Base::base_pub' is inaccessible
}

class B : public With_Protected_Base { void memberFn(); }
void B::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

class C : public With_Public_Base { void memberFn(); }
void C::memberFn()
{
    base_pri = 1; // error: `int Base::base_pri' is private
    base_pro = 1; // OK
    base_pub = 1; // OK
}

External access to the first three derived classes:

void main()
{
    With_Private_Base   pri_base;
    pri_base.base_pri = 1; // error: `int Base::base_pri' is private
    pri_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible

    With_Protected_Base pro_base;
    pro_base.base_pri = 1; // error: `int Base::base_pri' is private
    pro_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible

    With_Public_Base    pub_base;
    pub_base.base_pri = 1; // error: `int Base::base_pri' is private
    pub_base.base_pro = 1; // error: `int Base::base_pro' is protected
    pub_base.base_pub = 1; // OK
}

1a) Protected inheritance means the "child" can access everything it could in public inheritance, but others using that object can only see the public interface to the child, anything in it's parent is hidden.

1b) Private inheritance results in all public functions of a class being inherited as private functions - meaning they can not be called from the child or accessed from a client of your object.

2) Private members are inherited because methods in the base class might need them to operate on.

  1. Yes, this is correct. Derived classes can access protected and public members of it's base class, and the derived class can not access the private members of it's base class.

  2. The private members are inherited for the following reason: The base class can define a protected or public function that modifies the base class's private member. The derived class can call this function, and therefore needs to know about the private variable that it's accessing.

1) in protected inheritance, the public and protected members become protected members in the derived class. In the private inheritance, everything is private. However, the derived class can never access the private members of the base class, is that right?

Yes.

The derived class can access the public and protected members in both cases. Is that right?

Yes.

2) I noticed that the private members of the base class will never be touched by the derived class. So why are the private members inherited?

Because they are part of the base class, and you need the base class which is a part of your derived class. Note, you can still manipulate some state (if any) maintained in the base class using non-overriden public / protected member functions.

1) You are correct. No type of inheritance allows access to private members (only friend declarations allow that)

2) They're "inherited" in the sense that an object of type Derived, when stored in memory, includes all of the data members of Derived and Base, including private members of Base. The private members can't just go away since when methods of Base run on that object, they will need to access Base's private members.

Also, the names of the private members of Base are technically in scope in Derived's methods, but of course you'll get a compile error if you try to access them.

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