Re: avoid inheritance from std::map
On Dec 16, 11:33 pm, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
James Kanze wrote:
b) As a way to distingush types. E.g., one could define
template < typename ArithmeticType >
struct linalg_vector : public std::vector< ArithmeticType > {
// some constructors
};
template < typename LetterType >
struct word : public std::vector< LetterType > {
// some constructor
};
The nice thing is that now one could overload operator+ to
mean elementwise addition for linalg_vector and
concatenation for word.
Conceptually, the correct solution here is to use
containment, and redefine the interface in the containing
class.
Which one is more correct actually depends on your code base
and your intentions. If there is a reversal function
template < typename T >
void reverse ( std::vector<T> & vec );
then you have to answer the question whether it should match a
word or not. Depending on the answer, inheritance may or may
not be the more correct way to go.
Conceptually, it shouldn't. It says it wants an std::vector<T>.
std::vector<T> is not some arbitrary interface; it's a concrete
class.
Practically, of course, design is often the art of compromize,
and rather than write a completely new function, one might
prefer inheritance for that reason as well. (I'm not really
sure that "conceptually" is the word I'm looking for here. I
mean something that is really pure and abstract, independently
of any practical considerations.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34