C++:需要调用相同代码的虚函数?

Ann*_*inn 5 c++ inheritance c++11

我有一个基类和派生自它的类.基类Controllable充当输入循环的接口,并且从其派生的其他类在该循环中获取点以获取诸如按下键之类的事件.

class Controllable{
public:
    virtual void setActive(bool state) { m_active = state; }
    virtual void input(Event & e) =0;
private:
    bool m_active;
};

class Button : public Controllable{
public:
    void setActive(bool state){ /*do extra work*/ m_active = state; }
    void input(Event & e) override;
};
Run Code Online (Sandbox Code Playgroud)

由于Button该类处理来自事件队列的事件,因此将其设置为非活动状态(将其从输入循环中取出)可能会导致它丢失重要事件(如未按下的键),因此需要额外的代码才能将其置于友好的非活动状态国家应该在以后再次活跃起来.

我的问题是,确保setActive始终具有切换m_active到正确状态的预期效果的最佳方法是什么,同时,除非需要附加额外需要的代码,否则不需要派生类来定义它?

And*_*bel 9

保持setActive方法非虚拟,然后定义子类可以覆盖的单独protected方法activeChanged

class Controllable{
public:
    void setActive(bool state) { m_active = state; activeChanged(state); }
    virtual void input(Event & e) = 0;
protected: 
    virtual void activeChanged(bool newState) {}
private:
    bool m_active;
}

class Button : public Controllable{
protected:
    void activeChanged(bool newState){ /*do extra work*/ }
public:
    void input(Event & e);
};
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以将外部公共接口与用于子类的内部受保护接口分开.


Gre*_*ill 6

一种方法是定义"pre"和"post"虚拟方法:

class Controllable{
public:
    void setActive(bool state) {
        preSetActive(m_active, state);
        m_active = state;
        postSetActive(m_active);
    };
    virtual void input(Event & e) =0;
protected:
    virtual void preSetActive(bool oldState, bool newState) {}
    virtual void postSetActive(bool newState) {}
private:
    bool m_active;
}
Run Code Online (Sandbox Code Playgroud)

请注意,该setActive()方法在此技术中不是虚拟的.