Pure virtual function in an ABC

Discussion in 'C++' started by keith@bytebrothers.co.uk, Jul 4, 2007.

  1. Guest

    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
    , Jul 4, 2007
    #1
    1. Advertising

  2. wrote:
    > 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
    Stuart Redmann, Jul 4, 2007
    #2
    1. Advertising

  3. Ron Natalie Guest

    wrote:

    >
    > 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.
    Ron Natalie, Jul 4, 2007
    #3
  4. gpuchtel Guest

    On Jul 4, 10:12 am, wrote:
    > 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";
    }
    gpuchtel, Jul 4, 2007
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jiong Feng
    Replies:
    0
    Views:
    812
    Jiong Feng
    Nov 19, 2003
  2. Bruce Sam
    Replies:
    15
    Views:
    7,899
    John C. Bollinger
    Nov 19, 2004
  3. vsgdp

    ABC inheriting from ABC

    vsgdp, Sep 24, 2005, in forum: C++
    Replies:
    1
    Views:
    309
    vsgdp
    Sep 24, 2005
  4. Gunter Henriksen

    x.abc vs x['abc']

    Gunter Henriksen, May 13, 2009, in forum: Python
    Replies:
    1
    Views:
    350
    alex23
    May 15, 2009
  5. Replies:
    4
    Views:
    149
Loading...

Share This Page