class abc{
protected:
int x;
};
class b: public abc{
public :
void something(abc a){ a.x = 1;}
};
在倒数第二行代码中,我遇到了一个错误,提示我不能访问变量a的成员x。
错误:受保护的成员“abc::x”无法通过“abc”指针或对象访问。
有没有其他方法可以修改变量a的x值?
class abc{
protected:
int x;
};
class b: public abc{
public :
void something(abc a){ a.x = 1;}
};
在倒数第二行代码中,我遇到了一个错误,提示我不能访问变量a的成员x。
错误:受保护的成员“abc::x”无法通过“abc”指针或对象访问。
有没有其他方法可以修改变量a的x值?
void something(){ x = 1;}
b
可以修改继承的基类 "it" 的值,但其他对象的基本 abc
受保护的类属性仍然受保护并保留给自己。在这种情况下,通过函数 something
传递的 abc a
对象是另一个与对象 b
不相关联的对象。b
中可以访问另一个对象 b
的私有属性。但是,所示的继承基本上是说 "b
是 abc
,但 abc
不一定是 b
"。在函数 void something(abc a){ a.x = 1;}
中,如果将其更改为 something(b a)
,它将起作用,因为 b
可以访问另一个 b
。int main(){
abc data;
abc data2;
data.x = data2.x; //This won't work becuase you are outside the class
}
b
为类abc
的友元,这样任何对象b
都可以访问任何其他对象abc
的受保护成员。class abc{
protected:
int x;
friend class b;
};
class abc
的保护部分中添加一个受保护的setter函数,然后使用它来更改abc对象的私有和受保护成员。这将允许所有继承类更改具有受保护“setter”函数的abc值,而没有其他人。示例 - jaggedSpiresomething()
函数内部,您处于对象作用域中,因此可以使用this
关键字获取当前对象的指针。但在C++中,默认情况下,对象作用域内的解析是对象自身的作用域,因此您根本不需要加前缀。只需引用属性名称即可使解析成功。
实现您所要求的一种方法是在ABC类中设置一个名为setX()的函数,如下所示:
class abc
{
public:
void setX(int x){ this->x = x; }
protected:
int x;
};
然后在B类中像这样声明something
:
class b: public abc
{
public :
void something(abc a){ a.setX(1); }
};
然而,此时你可能干脆不需要B类,而是从你调用b.something(myABCObj)
的范围内直接调用myABCObj.setX(1)
。
'protected' 的意义在于,class b
可以通过 自身内部 而非传递的参数访问 class abc
中的 'x'。
例如,你的 B 类可以像这样:
class b: public abc{
public :
void something(){ x = 1; } //HA- I inherited a value from class abc that wasn't public and changed it!
};
所以在不同的范围内,你可以创建对象b myB;
和myB.x
将不被允许,但myB
将可以从其父类内部访问'x'。
something
。abc
对象传递给继承自类abc
的类b
的函数)?在你发布的代码中,一开始似乎没有继承的意义。也许你最初打算设置this->x = 1
,但在某个地方感到困惑了...?