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

时间:2010-07-27 14:00:20

标签: c++ inheritance oop

我正在开发一个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
    }
}

我想到的一个解决方法是使用C :: foo()中的B :: foo()从C调用父方法。这是有效的,但是由开发人员记住在方法的主体中添加调用。

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

谢谢你, 3mpty。

4 个答案:

答案 0 :(得分:4)

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

class C : public B
{
    virtual void OnKeyPress(event e)
    {
        B::OnKeyPress(e);
        // Do stuff
    }
};

重新阅读你的问题.....

最好的办法是在B中实现最后调用C实现的附加受保护虚拟方法的方法。

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

如果你想强迫任何后代覆盖它,你可以将B中的AdditionalKeyStuff(...)设为纯虚拟。

答案 1 :(得分:1)

没有。没有办法进行这种隐含的调用。

另外,你在问题中提供了两种方法来做到这一点!

答案 2 :(得分:1)

“几乎”与问题相同,但分离公共类接口和继承接口 - 对所有类型的检测都非常有用:

class A
{
private:

    virtual void DoOnKeyPress( event ) = 0;

    void PreKeyPress( event ) { /* do something */ }
    void PostKeyPress( event ) { /* do something */ }

public:

    virtual ~A() {}

    void OnKeyPress( event e )
    {
        PreKeyPress( e );
        DoOnKeyPress( e );
        PostKeyPress( e );
    }
};

class B : public A
{
private:

    virtual void DoOnKeyPress( event e )
    {
        std::cout << "Keypressed: " << e << std::endl;
    }
};

答案 3 :(得分:0)

只有在有问题的方法是构造函数时才有可能,然后只有在构造对象时才会发生这种情况。如果你可以安排在构造函数中完成所有必要的工作,那么你可能会有一些东西,但是很难概括出这个解决方案。