Pure virtual function in an ABC

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • keith@bytebrothers.co.uk

    Pure virtual function in an ABC


    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

  • Stuart Redmann

    #2
    Re: Pure virtual function in an ABC

    keith@bytebroth ers.co.uk 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

    Comment

    • Ron Natalie

      #3
      Re: Pure virtual function in an ABC

      keith@bytebroth ers.co.uk 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::PureVi rtualFunction() {
      Base::PureVirut alFunction();
      }

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

      Comment

      • gpuchtel

        #4
        Re: Pure virtual function in an ABC

        On Jul 4, 10:12 am, k...@bytebrothe rs.co.uk 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_ide ntifier()' would be declared as a pure
        virtual method with a default implementation.

        For example:

        std::string Concrete_derive d::get_unique_i dentifier()
        {
        std::string uid = Abstract_base:: get_unique_iden tifier(); // gets
        a common prefix

        return uid += "unique suffix";
        }

        Comment

        Working...