如何访问"父"受保护的成员?

mar*_*zzz 3 c++ inheritance

这是我的代码的"模拟" :

#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();
}
Run Code Online (Sandbox Code Playgroud)

我无法触及该变量的protected状态类型test,因为来自另一个框架,我没有真正的"访问".

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

这样做有什么好看的方式吗?在BI内可以使用测试没有任何问题......

Chr*_*phe 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.  
};
Run Code Online (Sandbox Code Playgroud)

在线演示

劝告

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

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