Question

When I'm in Sub::f() and try to access the protected members of another sub-class to which the Base* b pointer points to, it won't compile until Sub is a friend of Base. Why do I need to do this?

class Base{
//friend class Sub;
protected:
    int i;
    virtual void f() = 0;
};

class Sub : public Base{
    Base* b;
public:
    Sub(Base* ba) : b(ba){}
    void f(){
        b->f();
        cout << b->i << endl;
    }
};
Was it helpful?

Solution 2

protected members are accessible in own class and in derived class but not outside of the class so if you want to do it, use 'friend'. And because of this feature provided by CPP,CPP is not 'fully or complete' object oriented programming language (loophole) as we can access private members too with friend's help.

OTHER TIPS

protected can be accessed only in hierarchy, but if you want exception, making friend is the way.

Friend class can access both private and protected members of the class.

b->f() and b->i are not accessing f and b of his own base, but of somebody else base (the one pointed by b)

sub    base
|____b_|___i___|
     |
     |_
       |
       V
sub    base
|____b_|___i___|
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top