共有A,B,C三类; A类与B是朋友,B具有受保护的数据成员。 C类是从A类公开继承的。我可以通过在C函数中初始化B对象来访问B的那些受保护数据成员吗?
如果没有,我将如何在C函数中访问B的值?
答案 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.
}
};