我怎样才能访问父母"保护会员?

时间:2016-07-21 18:39:22

标签: c++ inheritance

这是一个"模拟"我的code

.bar

我无法触及该#include <string> #include <iostream> using namespace std; class A { protected: int test = 10; }; class C; class B : public A { private: C *c; public: B(); }; class C { public: C(B *b) { cout << b->test; } }; B::B() { c = new C(this); } int main() { B(); } 变量的protected状态类型,因为它来自另一个框架而且我没有真正的访问权限#34;。

我需要从B(扩展A)创建一个C类实例,将B传递给它并访问(从C)到A的参数test

有没有一种奇特的方式呢?在B中我可以毫无问题地使用测试...

2 个答案:

答案 0 :(得分:5)

C类不从B继承,因此B不是父类,因此C类无权访问受保护的成员。

解决方法

如果您控制B和C但不允许触摸来自其他框架的A,您可以尝试:

class B : public A
{
private:
    C *c;

public:
    B();
friend C;  // Make C a friend of B so that it has access.  
};

Online demo

<强>劝

尽管有一种技术解决方法可以实现您的目标,但这样做可能并不明智。受保护成员的想法是它的实现细节仅与派生类相关。通过友谊打开它,您可以创建一个依赖于您不应该访问的实现细节。所以你违反了框架的设计原则。可能但风险自负。

另一种方法可能是将公共getter添加到B中的受保护元素,然后在C中引用此公共成员(demo)。它更好,但你仍然会暴露你不应该的数据。

答案 1 :(得分:3)

您还可以在B中添加公共访问者:

class B : public A
{
private:
    C *c;

public:
    B();
    int get_test() const { return this->test; }
};