参考和朋友类别的意外行为

时间:2018-12-03 10:19:09

标签: c++

使用friend关键字和引用时,我的行为异常。这是代码:

#include <iostream>

class Modifier;

class A{
 private:
     int _a;
     friend Modifier;
};
class B : public A {};

class Modifier
{
public:
    void f(A& i) { i._a = 10; std::cout << i._a << std::endl; }
};
int main()
{
    Modifier m;
    B b;
    m.f(b);
}
// Output
// 10

B不能修改变量 _a 。有人可以解释一下这是怎么可能的吗?

3 个答案:

答案 0 :(得分:2)

  

B不能修改变量_a

_a和包含它的对象是非常量的,因此可以修改_a。将成员声明为私有并不会阻止变量被修改。访问说明符仅影响可访问变量名称的范围。

B 不会修改变量_aModifier::f修改了_a变量(它是变量A的{​​{1}}基础子对象的成员)。 bModifier类的朋友,因此A的成员函数可以访问Modifier的私有声明名称。具有访问权限意味着它可以使用名称A

答案 1 :(得分:0)

B已经无法修改_a,因为它已在B中声明为私有。只能在A中访问。如果您需要从_a阅读B,请使用受保护的吸气剂:

class A {
    protected:
        auto get_a() const { return _a; }

    private:
        int _a;
        friend Modifier;
};

答案 2 :(得分:0)

朋友类可以访问其他被声明为朋友的类的私有和受保护成员。因此,_a可以通过类Modifer的任何方法进行修改。但是,B无法修改_a,因为它在类A中定义为私有。例如,如果您要在类f中实现方法B,则会出现编译器错误,提示'int A::_a' is private

class B : public A {    
    void f(A& i) { i._a = 10; std::cout << i._a << std::endl; }
};