当我在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;
}
};
答案 0 :(得分:1)
protected
只能在层次结构中访问,但如果你想要例外,那就是建立朋友。
朋友班可以访问班级的private
和protected
成员。
答案 1 :(得分:0)
protected 成员可以在自己的类和派生类中访问,但不能在类之外访问,所以如果你想这样做,请使用'friend'。由于CPP提供的这一功能,CPP不是“完全或完整”的面向对象编程语言(漏洞),因为我们也可以在朋友的帮助下访问私人成员。
答案 2 :(得分:0)
b->f()
和b->i
没有访问自己的f
和b
,而是访问其他人(b
所指的那个)< / p>
sub base
|____b_|___i___|
|
|_
|
V
sub base
|____b_|___i___|