2013-11-19 3 views
0

Я расстраиваюсь каким-то странным поведением и задаюсь вопросом, принимаю ли я что-то в порядке, когда это не так. Имеет ли значение следующее: я могу изменить 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; 
}; 
+0

этого использование должно быть хорошо. из интереса, почему это летучее? – Useless

+0

Да, конечно, это действует. –

+2

'm_flag ++;' на bool-типе ?! – Bathsheba

ответ

1

я могу изменить m_flag в переопределен foo()?

Нет, потому что в коде вы в курсе, class B не наследует от class A. Это означает, что нет foo() для переопределения.

class B сам объявляет m_flag, поэтому вы прекрасно вносите его в B::foo().

Обратите внимание: что, как уже указывали другие, оператор increment на bool устарел.

+0

См. Редактирование. Я заработал оригинальный пост. –

1

Да, но ...

Тип m_flagbool является. Приращение bool было с самого начала устарело и несколько удивительно. семантика: это эквивалентно установке значения true. .

(Причина этого странного поведения восходит к ранним дней C, когда не было какой-либо bool Один тип частности идиома было что-то вроде:

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

Идея заключалась в том, что, позволяя приращение, используя код этой идиому может изменить argsSeen к типу bool, а не перерыва.

Смежные вопросы