CASE 1: Following code is not working...saying error: `int Base::j' is protected error: within this context Code: #include<iostream.h> class Base { public: Base() { i=10; j=20;} int i; protected: int j; }; class Derived : public Base { public: Derived() { k=30;} int k; void fun(Base); }; void Derived :: fun(Base b) { b.i=100; b.j=200; //Problem is here... } int main() { Base Bobj; Derived Dobj; Dobj.fun(Bobj); return 0; } CASE 2: This code works fine...This is reasonable... Code: #include<iostream.h> class Base { public: Base() { i=10; j=20;} int i; protected: int j; }; class Derived : public Base { public: Derived() { k=30;} int k; void fun(Base); }; void Derived :: fun(Base b) { b.i=100; this->j =200; //b.j=200; } int main() { Base Bobj; Derived Dobj; Dobj.fun(Bobj); return 0; } But in case 1, i think compilation error should not come, because protected member is accesing by derived function only.
In base calss j is protected member. In case 1 you are trying to assign value for a protected member . so it failed. Where as in case 2, you used 'this' means derived class object. When a derived class object is created internally it will create base class object too . Since j is protected it is accessible by the derived class.. So you can assign the value. Where as in case 1 Base b is a different object, so you can't access the protected variable.