Re: A sterile class?
Gianni Mariani wrote:
Shuckey wrote:
Hello.
Is it possible to define a sterile class in C++? That is, a class that
cannot be inherited from?
I don't have an exact problem which would call for such a class. To be
quite frank, I can not even think of a concrete example where this would
be an issue. I'm just curious.
Well kinda using virtual inheritance.
class Steralizer
{
friend class Sterile;
Steralizer() {} // private
};
class Sterile : Steralizer
{
...
};
Attempts to inherit from Sterile will result in access errors to
Steralizer's constructor.
I have not figured out a way to make Steralizer a template so you can
write:
class A : Steralizer<A>
{
...
};
IIRC there is a prob with defining a class as a friend in a template.
Yes, the problem is in [7.1.5.3/2]
... If the identifier resolves to a typedefname or a template
type-parameter, the elaborated-type-specifier is ill-formed. [Note: this
implies that, within a class template with a template type-parameter T,
the declaration
friend class T;
is ill-formed. ]
But (a) there is some indication on n2134 that this provision will go away
and (b) you can use a macro:
/*
| This defines the macro
|
| FINAL
|
| to be used to prevent derivation:
|
| struct X : FINAL {};
|
| struct Y : X {}; // declaring variables of this type won't work
*/
// credits:
/*
Found in news.lang.c++.moderated (Gennaro Prota)
see:
http://groups.google.com/group/comp.lang.c++.moderated/browse_frm/thread/4478b819f8be67aa/f63980680a2f7136?lnk=gst&q=sealed&rnum=3#f63980680a2f7136
*/
class protected_constructor {
protected:
protected_constructor ( void ) {}
}; // protected_constructor
#define FINAL private virtual protected_constructor
struct X : FINAL {};
struct Y : X {}; //
int main ( void ) {
X x; // fine.
Y y; // compile time error.
}
Best
Kai-Uwe Bux