Re: STL non virtual DTOR
On Feb 25, 8:56 am, "Jiang" <goo.mai...@yahoo.com> wrote:
Within the standard library, public inheritance like this
template < typename T, typename A
struct vector : public __sequence<T,A>
, public __basic_vector<T,A> {
// some more members and constructor
};
is also an implementation detail. The user cannot declare
functions with signature
some_type some_func ( __sequence<T,A> const & );
without using reserved identifiers. Similarly, there cannot be a
polymorphic
__sequence<T,A> *
in client code without visibly invoking undefined behavior.
But compared with protected or private inheritance, what is the
benifit of using the above public inheritance?
Just a guess, but maybe the base types contain necessary
typedefs. Even in user code, it's not rare to do something
like:
class MyIter : public std::iterator< ... >
That doesn't mean that using pointers to an std::iterator to
refer to instances of my class is legitimate.
Inheritance can fulfill many roles in C++, and polymorphism, in
the OO sense, is just one of them (albeit by far the most
frequent). Similarly, a class can be designed to be used as a
base class for many reasons---std::iterator is definitly
designed to be used as a base class, but it makes no sense for
anyone ever to have an std::iterator<>*. (Today, I think we'd
probably give the class a protected destructor, just in case,
but the technique wasn't really known when the class was
designed. And frankly, given its semantics, who's going to
create a pointer to it anyway.)
In the case of std::list, we have a class which was NOT designed
to be a base, regardless of the use of inheritance. And one
could very easily imagine reasonable cases where the user had a
pointer or a reference to std::list. So publicly inheriting
from is not a good idea. Even if not doing so implies a bit of
extra typing.
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]