为什么需要成为朋友才能访问受保护的成员?

时间:2014-01-29 08:04:01

标签: c++ friend protected

当我在Sub::f()并尝试访问Base* b指针所指向的另一个子类的受保护成员时,它将不会编译,直到Sub为基地的朋友。为什么我需要这样做?

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;
    }
};

3 个答案:

答案 0 :(得分:1)

protected只能在层次结构中访问,但如果你想要例外,那就是建立朋友。

朋友班可以访问班级的privateprotected成员。

答案 1 :(得分:0)

protected 成员可以在自己的类和派生类中访问,但不能在类之外访问,所以如果你想这样做,请使用'friend'。由于CPP提供的这一功能,CPP不是“完全或完整”的面向对象编程语言(漏洞),因为我们也可以在朋友的帮助下访问私人成员。

答案 2 :(得分:0)

b->f()b->i没有访问自己的fb,而是访问其他人(b所指的那个)< / p>

sub    base
|____b_|___i___|
     |
     |_
       |
       V
sub    base
|____b_|___i___|