I ran into an error yesterday and, while it's easy to get around, I wanted to make sure that I'm understanding C++ right.
I have a base class with a protected member:
class Base { protected: int b; public: void DoSomething(const Base& that) { b+=that.b; } };
This compiles and works just fine. Now I extend Base but still want to use b:
class Derived : public Base { protected: int d; public: void DoSomething(const Base& that) { b+=that.b; d=0; } };
Note that in this case DoSomething
is still taking a reference to a Base
, not Derived
. I would expect that I can still have access to that.b
inside of Derived
, but I get a cannot access protected member
error (MSVC 8.0 - haven't tried gcc yet).
Obviously, adding a public getter on b
solved the problem, but I was wondering why I couldn't have access directly to b
. I though that when you use public inheritance the protected variables are still visible to the derived class.
If a class is derived privately from a base class, all protected base class members become private members of the derived class. Class A contains one protected data member, an integer i . Because B derives from A , the members of B have access to the protected member of A .
We can access protected members of a class in another class that is present in the same package.
public inheritance makes public members of the base class public in the derived class, and the protected members of the base class remain protected in the derived class. protected inheritance makes the public and protected members of the base class protected in the derived class.
Accessing a protected class. Accessing display function from the same package but different. Accessing display function from a different package. Accessing a protected class by overriding to sub-class within the same package.
A class can only access protected members of instances of this class or a derived class. It cannot access protected members of instances of a parent class or cousin class.
In your case, the Derived
class can only access the b
protected member of Derived
instances, not that of Base
instances.
Changing the constructor to take a Derived
instance will solve the problem.
protected
members can be accessed:
this
pointerTo solve your case you can use one of last two options.
Accept Derived in Derived::DoSomething or declare Derived friend
to Base:
class Derived; class Base { friend class Derived; protected: int b; public: void DoSomething(const Base& that) { b+=that.b; } }; class Derived : public Base { protected: int d; public: void DoSomething(const Base& that) { b+=that.b; d=0; } };
You may also consider public getters in some cases.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With