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
为什么我无法访问它?它只能在我需要它的类中"访问"吗?不在外面使用指针/直接声明?
当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派生的类.[示例:
Run Code Online (Sandbox Code Playgroud)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) }- 结束例子]
我不确定你的设计的意图,结交TestB朋友TestA将是一个简单的解决方案.
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |