【发布时间】:2016-04-11 05:40:08
【问题描述】:
下面的sn-p让我感到不解。 为什么 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;
}
【问题讨论】:
-
因为这就是语言的工作方式。访问权限不仅限于一个人的
this实例。 -
protected就是为了这个。protected成员可以被派生类访问,private不能。 -
如果希望派生类不能访问父类的成员变量,请将其标记为private。
标签: c++ inheritance copy accessibility