C++ how to call method in derived class from base class

14,869

Solution 1

You can use a template method:

class Base
{
 public:
  void Execute()
  {
    BaseDone(42);
    DoDone(42);
  }
 private:
  void BaseDone(int code){};
  virtual void DoDone(int) = 0;
};

class Derived : Base
{
 public:
  void Run() { Execute(); }
 private:
  void DoDone(int code) { .... }
};

Here, Base controls how its own and derived methods are used in Execute(), and the derived types only have to implement one component of that implementation via a private virtual method DoDone().

Solution 2

The base class method can call the derived method quite simply:

void Base::Execute()
{
    Done(42);
}

To have the base class Done() called before the derived class, you can either call it as the first statement in the derived class method, or use the non-virtual idiom.

Here's an example of calling it at the top of the derived class method. This relies on the derived class to get it right.

void Derived::Done(int code)
{
    Base::Done(code);
}

Here's an example of using the non-virtual idiom:

class Base
{
    void Done(int code){
        // Do whatever
        DoneImpl(); // Do derived work.
    }
    virtual void DoneImpl() { };
    ...
 };

 class Derived {
     virtual void DoneImpl() { 
         // Do derived class work.
     };
     ...
 };
Share:
14,869

Related videos on Youtube

adviner
Author by

adviner

Updated on September 15, 2022

Comments

  • adviner
    adviner almost 2 years

    What I want to do is for Execute() to run and completes it calls the Base::Done() then calls the Derived::Done(). I'm doing this because Base class Execute will do something and when its done call the Derived::Done(). I hope I'm explaining it correctly. Kind of like a listener that is called when a task completed. I'm kinda stuck on how the Base class will call the Derived class.

    class Base
    {
      virtual void Done(int code){};
      void Execute();
    }
    
    void Base::Execute()
    {
    }
    
    
    class Derived : Base
    {
      void Done(int code);
      void Run();
    }
    
    Derived::Done(int code)
    {
    }
    
    void Derived::Run()
    {
        Execute();
    }
    
    • Luchian Grigore
      Luchian Grigore about 11 years
      Although this can be done, you're probably looking for the template method pattern (google).
  • adviner
    adviner about 11 years
    Thanks for the information. I have a better understanding of it now
  • adviner
    adviner about 11 years
    I tried this example but I keep getting a error no matching function for call to Base::DoneImpl()
  • Andy Thomas
    Andy Thomas about 11 years
    For what part of the example above do you get an error? [Here's working source for the first option: ideone.com/8Iw6Hl .]