Pure virtual function in an ABC

K

keith

Dear mentors and gurus,

I noticed at the end of section 22.4 of the 'FAQ-Lite' it says "Note
that it is possible to provide a definition for a pure virtual
function, but this usually confuses novices and is best avoided until
later".

I've read through all the later stuff, and (although I may have missed
it) I can't find anything further on this. Can someone please explain
why in all the Halls of Hades you would declare a member function to
be pure virtual (i.e. _must_ be provided by any derived class) and
then provide a definition for it in the Abstract Base Class?!

Thx
 
S

Stuart Redmann

Dear mentors and gurus,

I noticed at the end of section 22.4 of the 'FAQ-Lite' it says "Note
that it is possible to provide a definition for a pure virtual
function, but this usually confuses novices and is best avoided until
later".

I've read through all the later stuff, and (although I may have missed
it) I can't find anything further on this. Can someone please explain
why in all the Halls of Hades you would declare a member function to
be pure virtual (i.e. _must_ be provided by any derived class) and
then provide a definition for it in the Abstract Base Class?!

I can thing of only this scenario: Your base class A declares a pure virtual
method, and you have 3 classes X, Y, and Z derived from A. X and Y can implement
the virtual method in the same manner, Z needs a different implementation.
Instead of copying the code for X and Y, you can provide the common
implementation for the pure virtual method in A, so that X and Y can simply
forward the call to the base class version. Z has to provide its own version of
the pure virtual method (were the method not pure, the implementor of Z could
oversee to implement the method, which leads to unforeseen errors). By defining
a pure virtual method you provide a standard implementation, but derived classes
have to state explicitely that this standard implementation is OK.

Regards,
Stuart
 
R

Ron Natalie

I've read through all the later stuff, and (although I may have missed
it) I can't find anything further on this. Can someone please explain
why in all the Halls of Hades you would declare a member function to
be pure virtual (i.e. _must_ be provided by any derived class) and
then provide a definition for it in the Abstract Base Class?!
Well, in the case of a destructor, because you have to :)

You may do it because:

1. While the base class function might be a default, you want
the user to explicitly make the decision to use it, in
which case they'll just do:

void Derived::pureVirtualFunction() {
Base::pureVirutalFunction();
}

2. The Base function may provide some features that need to be
done in addition to processing in the derived class function.
 
G

gpuchtel

Dear mentors and gurus,

I noticed at the end of section 22.4 of the 'FAQ-Lite' it says "Note
that it is possible to provide a definition for a pure virtual
function, but this usually confuses novices and is best avoided until
later".

I've read through all the later stuff, and (although I may have missed
it) I can't find anything further on this. Can someone please explain
why in all the Halls of Hades you would declare a member function to
be pure virtual (i.e. _must_ be provided by any derived class) and
then provide a definition for it in the Abstract Base Class?!

Thx

If you want to force derived classes to implement a method, yet
provide default behavior each derived class (method) should call. For
example, the base (abstract) class method might generate a common
unique identifier (base) and the derived class method augments it.

You can "define and invoke a pure virtual method, provided it is
invoked statically and not through the virtual mechanism" (excerpt
from "Inside the C++ Object Model" by Stanley Lippman. p160-161). In
this case, 'get_unique_identifier()' would be declared as a pure
virtual method with a default implementation.

For example:

std::string Concrete_derived::get_unique_identifier()
{
std::string uid = Abstract_base::get_unique_identifier(); // gets
a common prefix

return uid += "unique suffix";
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top