如何在派生类函数中修改基类变量的受保护值?

3
class abc{
protected:
    int x; 
};
class b: public abc{
public :
    void something(abc a){ a.x = 1;}
};

在倒数第二行代码中,我遇到了一个错误,提示我不能访问变量a的成员x。

错误:受保护的成员“abc::x”无法通过“abc”指针或对象访问。

有没有其他方法可以修改变量a的x值?


2
  1. 在基类中添加getter/setter函数。
  2. 将此对象通过引用而非值传递给函数something
  3. 你确定这是你想要做的吗(即将一个abc对象传递给继承自类abc的类b的函数)?在你发布的代码中,一开始似乎没有继承的意义。也许你最初打算设置this->x = 1,但在某个地方感到困惑了...?
- barak manos
4个回答

2

2
在继承时,b 可以修改继承的基类 "it" 的值,但其他对象的基本 abc 受保护的类属性仍然受保护并保留给自己。在这种情况下,通过函数 something 传递的 abc a 对象是另一个与对象 b 不相关联的对象。
访问修饰符在类级别上工作,这意味着在对象 b 中可以访问另一个对象 b 的私有属性。但是,所示的继承基本上是说 "babc,但 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;
};

1
相反地,由于同一类的对象可以自由地编辑彼此的值,您可以在class abc的保护部分中添加一个受保护的setter函数,然后使用它来更改abc对象的私有和受保护成员。这将允许所有继承类更改具有受保护“setter”函数的abc值,而没有其他人。示例 - jaggedSpire

2

something()函数内部,您处于对象作用域中,因此可以使用this关键字获取当前对象的指针。但在C++中,默认情况下,对象作用域内的解析是对象自身的作用域,因此您根本不需要加前缀。只需引用属性名称即可使解析成功。


0

实现您所要求的一种方法是在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'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接