可以在重写的方法中修改私有成员变量吗

Is it okay to modify a private member variable in an overridden method?

本文关键字:成员 变量 修改 重写 方法      更新时间:2023-10-16

我对一些奇怪的行为感到沮丧,不知道我是否认为有些事情是好的,而事实并非如此。以下内容有效吗?即,我可以修改被覆盖的foo()中的m_flag吗?如果是这样的话,更险恶的事情正在发生,因为我认为m_flag是一回事,然后只有当我知道我没有主动修改B::foo()时,才报告它的其他事情。

class A {
public:
    virtual void foo() {
       // Do something.
    }
};
class B : public A{
public:
    virtual public void foo() {
        m_flag++;
    }
private:
    volatile uint8_t m_flag;
};

我可以修改被覆盖的foo()中的m_flag吗?

没有。因为在您发布的代码中,class B不是从class A继承的。这意味着没有foo()可以覆盖

class B本身声明了m_flag,所以您可以在B::foo()中修改它。

请注意,正如其他人已经指出的那样,bool上的增量运算符是不推荐使用的。

是的,但是。。。

m_flag的类型为bool。增加bool从一开始就被弃用,而且有点令人惊讶语义:它相当于将值设置为true

(这种奇怪行为的原因可以追溯到早期无bool型时。一个特别的成语是这样的:

int argsSeen = 0;
//  ...
if ( arg1Present ) {
    argsSeen ++;
    //  ...
}
//  And so on for each of the possible args...
if ( argsSeen ) {
    //  whatever...
}

其想法是,通过允许增量,代码使用这个习惯用法可以将argsSeen更改为类型bool,而不是打破