是否可以在重写方法中修改私有成员变量?

时间:2013-11-19 11:33:56

标签: c++

我对一些奇怪的行为感到沮丧,并想知道我是否假设某些事情没有问题。以下是否有效,即我可以修改被覆盖的m_flag中的foo()吗?如果是这样的话,会发生一些更加险恶的事情,因为我看到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;
};

2 个答案:

答案 0 :(得分:1)

  

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

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

class B自己声明m_flag,因此您可以在B::foo()中修改它。

请注意,正如其他人已经说过的那样,bool上的增量运算符已被弃用。

答案 1 :(得分:1)

是的,但是......

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

(这种奇怪行为的原因可以追溯到早期 C天,没有任何bool类型。一个特别的 成语是这样的:

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

这个想法是通过允许增量,代码使用 这个习惯用法可以将argsSeen更改为bool,而不是。{ 断裂。