使用基本 class 方法更改派生 class 中的基本 class 字段

Change base class fields in derived class with base class method

我不确定我哪里错了,但我这边似乎有些怀念。 我有一个基础 class 和一个派生的 class 以及本例中的一些方法。

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc)
    void reset(int curr_loc){
        curr_loc = curr_loc;
    }
}

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc)
}

Derived a(1);
a.reset(2);
a.curr_loc //is still 1?

当我现在调用“a.curr_loc”时,我仍然得到 1。我以为我会用方法 reset 覆盖值,但这是在不同的对象上完成的...... 有没有一种方法可以做到这一点,而无需为派生的 class 复制基础 class 的函数?

curr_loc = curr_loc;

这一行什么都不做。它为自己分配了一个变量。事实上还有一个名为 curr_loc 的实例变量在这里没有被引用,因为有一个同名的局部变量隐藏它。

您可以将参数重命名为其他名称,也可以显式使用 this 进行赋值。

this->curr_loc = curr_loc;

这段代码

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc)
    void reset(int curr_loc){
        curr_loc = curr_loc;
    }
}

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc)
}

有语法错误。

你需要写

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc){}
    void reset(int curr_loc){
        Base::curr_loc = curr_loc;
    }
};

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc) {}
};

注意成员函数reset的定义。它应该定义为

    void reset(int curr_loc){
        Base::curr_loc = curr_loc;
    }

或喜欢

    void reset(int curr_loc){
        this->curr_loc = curr_loc;
    }

否则此语句中参数ciur_loc赋值给自身

        curr_loc = curr_loc;

因为它隐藏了与 class Base 同名的数据成员。