为什么派生类不能通过指向base的指针访问其基类的受保护成员?

mar*_*zzz 5 c++ inheritance scope protected

这是代码:

class TestA
{
protected:
    int test=12;

public:
    TestA() {
        cout << "test a: " << test << endl;
    }
    ~TestA() {
    }
};

class TestB : public TestA
{   
public:
    TestB(TestA *testA) {
        cout << "test b: " << testA->test;
    }
    ~TestB() {
    }
};

int main ()
{
    TestA *pTestA=new TestA();
    TestB *pTestB=new TestB(pTestA);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试protected使用指向TestA类型对象的指针(因此,实例TestA)来访问成员.TestB也来源于TestA

为什么我无法访问它?它只能在我需要它的类中"访问"吗?不在外面使用指针/直接声明?

son*_*yao 7

当public从基类继承时,其受保护的成员将成为派生类的"保护成员",可以在派生类的成员函数中访问它们.但它们只能通过派生类本身(及其派生类)访问,不能通过基类访问.所以你test不能通过指针访问成员TestA,但通过指针访问它会很好TestB.

该标准为此提供了一些说明性样本.$ 11.4/1受保护的会员访问[class.protected]:

(仅保留示例代码的一部分)

当非静态数据成员或非静态成员函数是其命名类([class.access.base])的受保护成员时,将应用超出前面在子句[class.access]中描述的那些的附加访问检查.114如上所述之前,授予对受保护成员的访问权限,因为引用发生在朋友或某个类C的成员中.如果访问要形成指向成员的指针([expr.unary.op]),则嵌套名称说明符应为表示C或从C派生的类.所有其他访问涉及(可能是隐式的)对象表达式([expr.ref]).在这种情况下,对象表达式的类应为C或从C派生的类.[示例:

class B {
protected:
  int i;
};

class D1 : public B {
};

class D2 : public B {
  void mem(B*,D1*);
};

void D2::mem(B* pb, D1* p1) {
  pb->i = 1;                    // ill-formed
  p1->i = 2;                    // ill-formed
  i = 3;                        // OK (access through this)
  B::i = 4;                     // OK (access through this, qualification ignored)
}
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

我不确定你的设计的意图,结交TestB朋友TestA将是一个简单的解决方案.