c – 为什么我的对象不能访问公共基类中定义的另一个对象的受保护成员?

前端之家收集整理的这篇文章主要介绍了c – 为什么我的对象不能访问公共基类中定义的另一个对象的受保护成员?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码生成编译器错误

‘BaseTest::_protMember’ : cannot access protected member declared in
class ‘BaseTest’

为什么我不能在我的类SubTest中访问成员变量_protMember,即使它受到保护?

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

后续问题:

为什么在添加的复制构造函数中我可以访问另一个实例的受保护成员?

解决方法

您只能从您自己的基类实例访问受保护的成员…而不是作为参数提供给您的受保护成员.这完全是关于OO封装的.如果没有这个限制,正在构建的对象可能会使baseTest&的不变量无效.参数.

换句话说,您的SubTest可能会决定受保护成员的使用是否与另一个BaseTest派生类(例如SubTest2:BaseTest)对同一成员的使用冲突.如果你的SubTest代码被允许摆弄其他对象的数据,它可能会使SubTest2对象中的不变量无效,或者获得一些值 – 在预期的封装中 – 只是为了暴露给SubTest2和(可选 – 见下文) )SubTest2衍生物.

Followup question:
Why is it,that in the added copy constructor I can access protected members of another instance?

SubTest(const SubTest& x);  // can access x._protMember
SubTest(const BaseTest& x);  // cannot access x._protMember

上面的相同见解解释了为什么允许这样做:复制构造函数获得SubTest&而不仅仅是从BaseTest派生的任何旧对象,这个构造函数显然在SubTest抽象中.假设SubTest编码器熟悉SubTest提供的预期设计/封装,并且复制构造器被授予绕过并在另一个SubTest&上强制执行后置条件/不变量的访问权限.对象也是. (您正在从一个本身可能由同一个函数复制构造的对象进行复制,因此在“* this”这边保护它而不是ref-by-ref侧的保护根本没有太多保护,甚至忽略了你可能想要/需要访问的所有声音原因.

SubTest派生的对象可能会被意外地传递给SubTest复制构造函数(“切片”),但即使对于那种情况,SubTest& class可以控制进一步派生的对象是否可以使用_protMember执行任何意外操作 – 使用BaseTest :: _ protMember添加私有;声明是否要“最终化”对_protMember的访问并禁止任何派生类使用它.

原文链接:https://www.f2er.com/c/119459.html

猜你在找的C&C++相关文章