为什么从派生实例访问基类中的受保护变量是可以的

时间:2016-04-11 05:40:09

标签: c++ inheritance copy accessibility

以下片段让我感到困惑。 为什么der._x ++正确? 因为它是从Derived参数复制的临时局部变量。 它应该只能访问公共成员。 注释声明bs._x ++不能传递哪个应该是正确的。 请让我知道我误解的地方!提前谢谢!

谢谢你的回答。但我怀疑的是,der是从参数复制的Derived对象,换句话说,它应该被视为使用初始化的Derived对象的客户端。它不是* this实例,而是另一个由复制构造函数生成的临时实例。

class Base
{
public:
    Base(int x, int y) :_x(x), _y(y){}
protected:
    int _x, _y;
};

class Derived :public Base
{
public:
    Derived(int x, int y,int z) :Base(x,y), _z(z){}
    void mem1(Base bs, Derived der) //copy constructor called. Derived::Derived(const Derived &)
    {
        der._x++;
        //bs._x++;
        _x++;
    }
private:
    int _z;
};

    int main()
    {
        Derived der(6,4,3), der1(5,3,2);
        Base bs(-5,-4);
        der1.mem1(bs, der);
        return 0;
    }

1 个答案:

答案 0 :(得分:0)

der._x++ 可访问,因为_der是同一Derived类的对象,而您正在访问{{1}来自_x类的内部。

当你在一个类中时,你可以访问它的成员(有或没有对象引用)。否则{}禁止使用Derived,而不是:)

但是你不能对(*this)._x的任何其他类做同样的事情,因此不允许这样做。

bs._x++在很大程度上依赖于该语言的这一特性来实现它们。另外不要忘记Friends没有它就无法实现(因为你从类中调用它的Singleton)。