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

How can I access to a "parent" protected member?

本文关键字:保护 成员 何访问 访问      更新时间:2023-10-16

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

#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();
}

我不能触摸那个test变量的protected状态类型,因为它来自另一个框架,我没有真正的"访问权限"。

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

有什么奇特的方法吗?在B中,我可以毫无问题地使用测试。。。

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.  
};

在线演示

建议

尽管有一种技术上的变通方法可以实现您想要的,但这样做可能是不可取的。受保护成员的想法是,它的实现细节只与派生类相关。通过友好地打开它,你会创建一个对实现细节的依赖,而你不应该访问这些细节。所以你会违反框架的设计原则。可能,但风险自负。

另一种方法可以是在B中向受保护元素添加一个公共getter,然后在C中引用这个公共成员(demo)。这更好,但您仍然会公开不应该公开的数据。

您还可以在B:中添加一个公共访问器

class B : public A
{
private:
    C *c;
public:
    B();
    int get_test() const { return this->test; }
};