Reputation: 3567
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();
}
Upvotes: 8
Views: 16671
Reputation: 86489
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.
};
...
};
Upvotes: 4
Reputation: 227558
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()
.
Upvotes: 8