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

标签 c++ inheritance c++11

我有一个基类和派生自它的类。基类 Controllable 充当输入循环的接口(interface),其他类从它派生以在该循环中获得一个位置以获取事件,例如按下某个键。

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;
};

由于 Button 类处理事件队列中的事件,将其设置为非事件状态(将其从输入循环中取出)可能会导致它错过重要事件,例如未按下某个键,因此如果以后再次激活,它需要额外的代码才能将其置于友好的非事件状态。

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

最佳答案

保持 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);
};

通过这种方法,您可以将外部公共(public) 接口(interface)与用于子类的内部 protected 接口(interface)分开。

关于C++:需要调用相同代码的虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793110/

相关文章:

c++ - 我如何处理队列前端和弹出功能

c++ - 根据模板类型生成 lambda 主体(调用可调用对象并返回)

c++ - 继承自虚类并在构造时指定

c++ - 为什么不将字符串的第一个输入分配给 std::string 对象?

C++ 访问存储在 vector 中的对象的元素

c++ - 如何检查模板类型参数是字符类型还是字符串类型?

c++ - 已创建 vector 中的奇怪 std::bad_alloc

c++ - 如何修复主函数在传递参数时调用不正确的函数? (c++)

c++ - 继承类型定义?

c++ - C++14/17 项目是否可以使用使用 C++11 标准编译的二进制库,或者源代码是否需要重新编译?