以下代码生成编译器错误:
'BaseTest :: _ protMember':无法访问类'BaseTest'中声明的受保护成员
为什么我不能访问我的成员变量_protMember,class SubTest即使它受到保护?
class BaseTest
{
public:
BaseTest(){};
BaseTest(int prot)
{
_protMember = prot;
};
protected:
int _protMember;
};
class SubTest : public BaseTest
{
// followup question
SubTest(const SubTest &subTest)
{
_protMember = subTest._protMember; // this line compiles without error
};
SubTest(const BaseTest &baseTest)
{
_protMember = baseTest._protMember; // this line produces the error
};
};
Run Code Online (Sandbox Code Playgroud)
后续问题:
为什么在添加的拷贝构造函数中我可以访问另一个实例的受保护成员?
Ton*_*roy 11
您只能访问protected自己的基类实例中的成员...而不是作为参数提供给您的成员.这完全是关于OO封装的.如果没有此限制,正在构造的对象可能会使baseTest&参数的不变量无效.
换句话说,你SubTest可以决定一个protected成员的使用与另一个来自同一个成员的用法相冲突BaseTest(比方说SubTest2 : BaseTest).如果你的SubTest代码被允许摆弄其他对象的数据,它可能会使SubTest2对象中的不变量无效,或者得到一些值 - 在预期的封装中 - 只是为了暴露于SubTest2和(可选地 - 见下文)SubTest2衍生物.
后续问题:为什么在添加的复制构造函数中我可以访问另一个实例的受保护成员?
SubTest(const SubTest& x); // can access x._protMember
SubTest(const BaseTest& x); // cannot access x._protMember
Run Code Online (Sandbox Code Playgroud)
上面的相同见解解释了为什么允许这样做:复制构造函数获取的SubTest&不是任何派生自的旧对象BaseTest,而且这个构造函数显然在SubTest抽象中.该SubTest编码器被假定为精通与预期设计/封装SubTest提供,和拷贝构造被给予访问旁路,而另一个上执行后置条件/不变量SubTest&对象太.(您正在从一个本身可能由同一个函数复制构造的对象进行复制,因此在" *this"方面保护它而不是ref-by-ref方面保护它根本没有太多保护,甚至忽略所有你可能想要/需要访问的声音原因).
有可能SubTest会将一个非衍生对象意外地传递给SubTest复制构造函数("切片"),但即使对于那个场景,SubTest&该类也可以控制进一步派生的对象是否可以执行任何意外操作_protMember- private using BaseTest::_protMember;如果是,则添加一个语句想要"最终化"访问_protMember并禁止任何派生类使用它.
您protected只能在类实例中访问成员.那是 :
class SubTest : public BaseTest
{
SubTest(const BaseTest &baseTest)
{
_protMember = baseTest._protMember;
// ^^^^^^^^^^^ Is good because you are in the instance of its class
_protMember = baseTest._protMember;
// ^^^^^^^^^^^^^^^^^^^^^ Produce error because you are not in the baseTest instance.
};
// followup question
SubTest(const SubTest &subTest)
{
_protMember = subTest._protMember;
// Compile because access modifiers work on class level, and not on object level.
};
};
Run Code Online (Sandbox Code Playgroud)
编辑后续行动:
访问修饰符在类级别上工作,而不在对象级别上工作.
也就是说,同一类的两个对象可以访问彼此的私有成员.
这是我的来源:为什么我可以在复制构造函数中访问私有变量?
| 归档时间: |
|
| 查看次数: |
3805 次 |
| 最近记录: |