Boost logo

Boost :

From: Jonathan Wakely (cow_at_[hidden])
Date: 2005-01-13 06:30:50


On Thu, Jan 13, 2005 at 12:49:33PM +1000, kalin wrote:

> Hi All, I've made a simple implementation of making a class non-derivable.

I can't compile this with GCC3 or Comeau.
GCC2 lets me compile it (due to its flakey friend implementation) but it
also allows Bar to inherit from Foo!

This is a simpler way of preventing inheritance:

  class Finaliser
  {
  protected:
    Finaliser(){}
  };

  class Final : private virtual Finaliser
  {
    // rest of class as normal
  };

I think I first saw this in Dr. Dobbs in one of their single page tips.

It doesn't prevent derivation if the derived class has no user-defined
constructors (since the compiler-generated ones will access the virtual
base):
  class NotSoFinalNow : public Final { };

But does work if there are user-defined ctors:
  class WillNotCompile : public Final { WillNotCompile() {} }; // error

There's another problem with Final that lets you derive from it in a
class with user-defined constructors, if you know how. Our wiki where
I work offers a chocolate bar to anyone who points it out but noone's
claimed it from me yet :)

jon

-- 
"Consistency is the last refuge of the unimaginative."
	- Oscar Wilde

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk