在没有显式调用的情况下,在子方法之前强制执行父方法

3mp*_*pty 3 c++ oop inheritance

我正在开发一个 c++ 应用程序,但我面临一个问题:我有一个从抽象类 A 派生的类 B,它具有一些事件处理方法。第三个类 C 派生自 B,并且必须重新实现一些 B 方法。有没有办法在调用 C 的方法之前隐式调用 B 的方法?

类图:

class A
{
    virtual void OnKeyPress(event e)=0;
};
class B : public A
{
    virtual void OnKeyPress(event e)
    {
    print("Keypressed: "+e)
    };
};
class C : public B
{
    void OnKeyPress(event e)
    {
    //DoSomething
    }
}
Run Code Online (Sandbox Code Playgroud)

我想出的解决方法之一是使用 C::foo() 中的 B::foo() 从 C 调用父方法。这是可行的,但开发人员需要记住在方法的主体中添加调用。

另一种方法是定义一个新的虚拟方法,子进程将覆盖该方法,父进程将在其“OnKeyPress”方法中调用该方法。

谢谢,3mpty。

Adr*_*gan 6

您必须显式调用基类方法。

class C : public B
{
    virtual void OnKeyPress(event e)
    {
        B::OnKeyPress(e);
        // Do stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

只需重新阅读您的问题......

最好的办法是在 B 中实现方法,该方法最后调用一个额外的受保护的虚拟方法,由 C 实现。

IE

class B : public A
{
  protected:
       virtual void AdditionalKeyStuff(event e) { }

  public:

    virtual void OnKeyPress(event e)
    {
        // Do B Stuff

        // Finally give decendants a go.
        AdditionalKeyStuff(e)
    }
};


class C : public B
{
  protected:

    virtual void AdditionalKeyStuff(event e)
    {
        // Do only C stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

如果您想强制任何后代覆盖它,您可以使 B 中的 AdditionalKeyStuff(...) 成为纯虚拟的。