在继续派生函数之前执行基函数

| 我正在尝试解决一个问题,在这个问题中,我需要一些类来完成一些常见的工作,然后执行一堆针对特定问题的工作,完成这些后,还要对所有这些类进行更多的处理。 我有一个基类和派生类,它们都有一个称为Execute的函数。当我调用此函数的派生版本时,我希望能够对Base中所有派生类进行一些通用的处理,然后继续在Derived :: Execute中执行并返回到Base :: Execute以执行以下操作:完成一些常见的工作。 在C ++中这有可能吗?如何最好地做到这一点? 这是个主意,但是这样可能不太可行:
class Base
{
public:
   virtual void Execute();
};

Base::Execute() {
   // do some pre work
   Derived::Execute();  //Possible????
  // do some more common work...  
}


class Derived : public Base
{
public:
    void Execute();

};

void Derived::Execute()
{
   Base::Execute();
   //Do some derived specific work...
}

int main()
{

   Base * b = new Derived();

   b.Execute(); //Call derived, to call into base and back into derived then back into base

}
    
已邀请:
使用基本的纯虚函数。
class Base
{
public:
   void Execute();
private:
   virtual void _exec() = 0;
};

Base::Execute() {
   // do some common pre work
   // do derived specific work
   _exec();
  // do some more common work...  
}


class Derived : public Base
{
private:
    void _exec() {
     // do stuff 
    }
};

int main()
{

   Base * b = new Derived();

   b.Execute();

}
编辑:阅读更多问题后稍稍改变了流程..::)上面的机制应该完全符合您现在所需要的 即 基础共同的东西 派生特定的东西 再次基础共同的东西     
这在C ++中被称为NVI(非虚拟接口,从Herb Sutter那里过来)习惯用语,基本上说您不应该具有公共虚拟功能,而应该具有受保护/私有虚拟功能。用户代码将必须在基类中调用您的公共非虚拟函数,并将其分派到受保护/私有虚拟方法。 从设计的角度来看,基本原理是基类具有两个不同的接口,一方面是由该类的公共子集确定的用户界面,另一方面是可扩展性接口或如何扩展该类。通过使用NVI,您可以解耦两个接口并允许在基类中进行更大的控制。
class base {
   virtual void _foo();  // interface to extensions
public:
   void foo() {          // interface to users
      // do some ops
      _foo();
   }
};
    
将问题从头转向脚。您真正想要的是派生类可以插入的基类算法:
class Base {
public:
  void Execute()
  {
    // do something
    execute();
    // do some more things
  }
private:
  virtual void execute() = 0;
};

class Derived : public Base {
public:
  // whatever
private:
  virtual void execute()
  {
     //do some fancy stuff
  }
};
让派生类插入基类算法通常称为“模板方法”模式(与ѭ4无关)。在基类接口中没有公共虚函数通常称为“非虚拟接口”模式。 我相信Google可以在这两个方面找到很多东西。     
在两个函数中内部移动
Base::Execute
,然后使用RAII轻松实现。
class Base{
protected:
  void PreExecute(){ 
    // stuff before Derived::Execute
  }
  void PostExecute(){ 
    // stuff after Derived::Execute
  }

public:
  virtual void Execute() = 0;
};

struct ScopedBaseExecute{
  typedef void(Base::*base_func)();

  ScopedBaseExecute(Base* p)
    : ptr_(p)
  { ptr_->PreExecute() }

  ~ScopedBaseExecute()
  { ptr_->PostExecute(); }

  Base* ptr_;
};

class Derived : public Base{
public:
  void Execute{
    ScopedBaseExecute exec(this);
    // do whatever you want...
  }
};
    

要回复问题请先登录注册