C++ how to call method in derived class from base class
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.
};
...
};
Related videos on Youtube
adviner
Updated on September 15, 2022Comments
-
adviner almost 2 years
What I want to do is for
Execute()
to run and completes it calls theBase::Done()
then calls theDerived::Done()
. I'm doing this becauseBase
classExecute
will do something and when its done call theDerived::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 theBase
class will call theDerived
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 about 11 yearsAlthough this can be done, you're probably looking for the template method pattern (google).
-
-
adviner about 11 yearsThanks for the information. I have a better understanding of it now
-
adviner about 11 yearsI tried this example but I keep getting a error no matching function for call to Base::DoneImpl()
-
Andy Thomas about 11 yearsFor what part of the example above do you get an error? [Here's working source for the first option: ideone.com/8Iw6Hl .]