2014-01-29 32 views
-2

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

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

因为这friend'是什么'的。 – Maroun

+8

,因为你只能让你的朋友触摸你的私人部分。 –

+0

@ user2310289 LOL – Maroun

回答

0

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

1

protected只能在层次进行访问,但如果你想例外,交朋友是这样的。

朋友类可以访问类的成员privateprotected

0

b->f()b->i不是在访问f和他自己的基地b,但别人基地(一个由b指出)

sub base 
|____b_|___i___| 
    | 
    |_ 
     | 
     V 
sub base 
|____b_|___i___| 
+0

Thx;)这是一个很好的图片。 – Daniel

相关问题