在子类函数中访问父类的朋友的受保护数据成员

时间:2019-02-22 03:09:57

标签: c++ inheritance

共有A,B,C三类; A类与B是朋友,B具有受保护的数据成员。 C类是从A类公开继承的。我可以通过在C函数中初始化B对象来访问B的那些受保护数据成员吗?

如果没有,我将如何在C函数中访问B的值?

2 个答案:

答案 0 :(得分:0)

您不能直接在C中访问B的受保护成员,但可以在A中引入一个受保护的方法来获取/设置B中的受保护成员;由于C是从A派生的,因此您可以从C访问A中受保护的get / set方法,请参见下面的示例。也许最好考虑一下整体设计。

class A
{
protected:
    int getValueOfB(B& b) { return b.protectedValue; }
    void setValueInB(B& b, int value) { b.protectedValue = value; }
};

class C
{
    void doSomething()
    {
       B b;
       setValueInB(b, 1);
    }
}

答案 1 :(得分:0)

friend不被继承。
同样,friend中的friend不是friend

或者,passkey idiom可能对您有帮助:

class B;

class A
{
public:
    struct Key{
        friend class B; // no longer in class A.
    private:
        Key() = default;
        Key(const Key&) = default;
    };
    // ...
};

class C : public A
{
private:
    void secret(Key /*, ...*/) { /*..*/ }
};

class B
{
public:
    void foo(C& c) {
         c.secret(A::Key{}); // Access C private thanks to "private" key from A.
    }
};