friend
函数是否应该访问Base
类和Derived
类中的所有内容? class Derived: public Base
- > private
Base
中的所有内容现在都是派生类中的public
。
class Base
{
private:
int x;
};
class Derived : public Base
{
int y;
public:
void SetY(int value);
void friend SetX(Derived &d);
};
void SetX(Derived &d)
{
d.x = 100; // Why is this a problem?
// Isn't Base supposed to be public now that is inherited?
}
int main()
{
Derived d;
SetX(d);
}
答案 0 :(得分:2)
void friend SetX(Derived &d);
类的朋友函数Derived
只是该类的友元函数,它只能访问Derived
类的私有成员但不允许访问任何私有或受保护的类基类的成员。即使是Derieve类,您也无法访问Base类的私有成员,但只能访问public和protected成员。要访问/访问Base类的私有成员,您必须使用基类的公共成员函数。
C ++中有两种类型的继承
class B{};
class D:public B{};
上面提到的所有内容都适用于上述情况。即使您将基础B
类作为公共类别吸引到Derieve类D
,所有私人成员也会将D
作为受保护的私人受保护成员,并将其公开为公共。
但是如果你像下面那样私有地使用,那么Base类的所有成员现在都将成为Derieve类的私有成员。
class B{};
class D:private B{};
在这种情况下,友元函数甚至无法访问基类B
的任何成员。
答案 1 :(得分:1)
friend
函数是否应该访问Base
类和Derived
类中的所有内容?
没有。它是Derived
的朋友,所以它应该访问Derived
类可以访问的所有内容。
class Derived: public Base
- >private
Base
中的所有内容现在都是派生类中的public
。
没有。之前private
中Base
的所有内容仍为private
。
使用public
/ protected
/ private
进行继承means something different,而不是成员访问控制。