Connecting Tech Pros Worldwide Help | Site Map

"inheriting" constructors

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 18th, 2007, 10:45 AM
Christof Warlich
Guest
 
Posts: n/a
Default "inheriting" constructors

Hi,

I'd like to define a class that should behave as much as posible
like std::string, but that has some small additional property:

class ExtendedString: public std::string {
public:
void someExtendedFunctionality(void) {}
};

As new classes do not inherit the constructors from its base, is
it true that I would have to define counterparts for all std::string
constructors that I may want to use to construct my derived class?

class ExtendedString: public std::string {
public:
void someExtendedFunctionality(void) {}
ExtendedString(const char *data): std::string(data) {}
ExtendedString(const std::string &data): std::string(data) {}
ExtendedString(void): std::string() {}
// ......
};

Or is there some smarter way to tell the compiler that the constructors
of std::string may be used right away, saving all the typing effort?

Thanks for any tips,

Christof

  #2  
Old July 18th, 2007, 11:55 AM
Kai-Uwe Bux
Guest
 
Posts: n/a
Default Re: "inheriting" constructors

Christof Warlich wrote:
Quote:
Hi,
>
I'd like to define a class that should behave as much as posible
like std::string, but that has some small additional property:
>
class ExtendedString: public std::string {
public:
void someExtendedFunctionality(void) {}
};
>
As new classes do not inherit the constructors from its base, is
it true that I would have to define counterparts for all std::string
constructors that I may want to use to construct my derived class?
>
class ExtendedString: public std::string {
public:
void someExtendedFunctionality(void) {}
ExtendedString(const char *data): std::string(data) {}
ExtendedString(const std::string &data): std::string(data) {}
ExtendedString(void): std::string() {}
// ......
};
>
Or is there some smarter way to tell the compiler that the constructors
of std::string may be used right away, saving all the typing effort?
a) You can use templated constructors:

ExtendedString() : std::string() {}

template < typename A >
ExtendedString( A a ) : std::string( a ) {}

With std::string, I think you need to go up to 4 arguments.


b) It appears that your ExtendedString has no additional data members and
that the functionality provided by

void someExtendedFunctionality(void) {}

could as well be provided by a free-standing function. If so, a
free-standing functions is probably more appropriate. Maybe, you can even
come up with a generic implementation working on character-ranges. In that
case, you would have a more flexible addition to your library with less
code.


c) Many people frown upon public derivation from container classes. In my
opinion, it's not a deadly sin; but you should be aware of the possible
pitfalls:

1) Keep in mind that the destructor of std::string is non-virtual.

2) Note that functions like

std::string some_func( std::string const & str );

will happily accept ExtendedString objects as arguments, but they
will return std::string output. There are situations, where this
can get tricky.


Best

Kai-Uwe Bux
  #3  
Old July 18th, 2007, 01:25 PM
Christof Warlich
Guest
 
Posts: n/a
Default Re: "inheriting" constructors

Kai-Uwe Bux schrieb:
Quote:
a) You can use templated constructors:
>
ExtendedString() : std::string() {}
>
template < typename A >
ExtendedString( A a ) : std::string( a ) {}
>
With std::string, I think you need to go up to 4 arguments.
Thanks, that was the type of idea I was looking for. Although
it's a pity that it still needs one definition for each number
of parameters that shall be supported ...
Quote:
c) Many people frown upon public derivation from container classes. In my
opinion, it's not a deadly sin; but you should be aware of the possible
pitfalls:
>
1) Keep in mind that the destructor of std::string is non-virtual.
>
2) Note that functions like
>
std::string some_func( std::string const & str );
>
will happily accept ExtendedString objects as arguments, but they
will return std::string output. There are situations, where this
can get tricky.
But even more thanks for pointing out the pitfalls!
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,840 network members.