Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > container of pointers and virtual member function templates

Reply
Thread Tools

container of pointers and virtual member function templates

 
 
Sat
Guest
Posts: n/a
 
      11-12-2003
Hi,

I have a simplified version of a problem that I am facing (hope I haven't
oversimplified it). This code doesn't work now and I want to find how I can
make it work. Can I call the derived class version from the base class
pointer and still be able to use a vector with derived element pointers?

class BaseElem { };

class DerivedElem1 { };

class DerivedElem2 { };

class BaseContainer
{
public:
virtual void GetAllElems(std::vector<BaseElem*>& allElems) const;
};

class DerivedContainer1
{
public:
virtual void GetAllElems(std::vector<DerivedElem1*>& allElems) const;
};

class DerivedContainer2
{
public:
virtual void GetAllElems(std::vector<DerivedElem2*>& allElems) const;
};


 
Reply With Quote
 
 
 
 
David White
Guest
Posts: n/a
 
      11-13-2003
"Sat" <> wrote in message
news:bou5if$vgd$...
> Hi,
>
> I have a simplified version of a problem that I am facing (hope I haven't
> oversimplified it). This code doesn't work now and I want to find how I

can
> make it work. Can I call the derived class version from the base class
> pointer and still be able to use a vector with derived element pointers?
>
> class BaseElem { };
>
> class DerivedElem1 { };
>
> class DerivedElem2 { };


You haven't derived either of the last two classes from the first one.

> class BaseContainer
> {
> public:
> virtual void GetAllElems(std::vector<BaseElem*>& allElems) const;
> };
>
> class DerivedContainer1
> {
> public:
> virtual void GetAllElems(std::vector<DerivedElem1*>& allElems) const;
> };
>
> class DerivedContainer2
> {
> public:
> virtual void GetAllElems(std::vector<DerivedElem2*>& allElems) const;
> };


Again, neither of your "derived" containers derives from your base
container. In fact, you have no inheritance anywhere in this code.

Even if you specify the inheritance that you appear to have intended for
both elements and containers, your derived-class virtual functions do not
override the base-class virtual function. A vector<BaseElem*> is a type
unrelated to vector<DerivedElem1*>, so if I've understood your question
correctly the answer is "no".

DW



 
Reply With Quote
 
 
 
 
Sat
Guest
Posts: n/a
 
      11-13-2003
Thanks David, You understood the question correctly. The inheritance part
was missing in my code.

I have re-written it here:
class BaseElem { };

class DerivedElem1 : public BaseElem { };

class DerivedElem2 : public BaseElem { };

class BaseContainer
{
public:
virtual void GetAllElems(std::vector<BaseElem*>& allElems) const;
};

class DerivedContainer1 : public BaseContainer
{
public:
virtual void GetAllElems(std::vector<DerivedElem1*>& allElems) const;
};

class DerivedContainer2 : public BaseContainer
{
public:
virtual void GetAllElems(std::vector<DerivedElem2*>& allElems) const;
};

I understand that the std::vector<DerivedElem*> is unrelated to
std::vector<BaseElem*>. I am trying to see if anyone has a good idea of
implementing this in a different way. The intent is to return a bunch of
DerivedElem pointers in a container using a virtual function.

I tried making GetAllElems a templated member function like this:

template<ElemType>
virtual void GetAllElems(std::vector<ElemType>& allElems) const;

but later found that templated member functions cannot be virtual functions.
That's why I am stuck.

Thanks
Sat

"David White" <> wrote in message
news:GoEsb.1225$...
> "Sat" <> wrote in message
> news:bou5if$vgd$...
> > Hi,
> >
> > I have a simplified version of a problem that I am facing (hope I

haven't
> > oversimplified it). This code doesn't work now and I want to find how I

> can
> > make it work. Can I call the derived class version from the base class
> > pointer and still be able to use a vector with derived element pointers?
> >
> > class BaseElem { };
> >
> > class DerivedElem1 { };
> >
> > class DerivedElem2 { };

>
> You haven't derived either of the last two classes from the first one.
>
> > class BaseContainer
> > {
> > public:
> > virtual void GetAllElems(std::vector<BaseElem*>& allElems) const;
> > };
> >
> > class DerivedContainer1
> > {
> > public:
> > virtual void GetAllElems(std::vector<DerivedElem1*>& allElems)

const;
> > };
> >
> > class DerivedContainer2
> > {
> > public:
> > virtual void GetAllElems(std::vector<DerivedElem2*>& allElems)

const;
> > };

>
> Again, neither of your "derived" containers derives from your base
> container. In fact, you have no inheritance anywhere in this code.
>
> Even if you specify the inheritance that you appear to have intended for
> both elements and containers, your derived-class virtual functions do not
> override the base-class virtual function. A vector<BaseElem*> is a type
> unrelated to vector<DerivedElem1*>, so if I've understood your question
> correctly the answer is "no".
>
> DW
>
>
>



 
Reply With Quote
 
David White
Guest
Posts: n/a
 
      11-13-2003
"Sat" <> wrote in message
news:bp0cri$uuh$...
> I understand that the std::vector<DerivedElem*> is unrelated to
> std::vector<BaseElem*>. I am trying to see if anyone has a good idea of
> implementing this in a different way. The intent is to return a bunch of
> DerivedElem pointers in a container using a virtual function.
>
> I tried making GetAllElems a templated member function like this:
>
> template<ElemType>
> virtual void GetAllElems(std::vector<ElemType>& allElems) const;
>
> but later found that templated member functions cannot be virtual

functions.

That's right, probably because of implementation difficulties for the
compiler in constructing a v-table that can support templates.

> That's why I am stuck.


I can't think of any really nice way to do it. The best I can come up with
is a virtual function that takes a std::vector<BaseElem*> &, and a
non-virtual member function template in the base class that calls the
virtual function and converts the vector it creates into another vector of
the correct type of element using a cast. Or, if you want to ensure type
safety at the expense of execution time, you can dynamic_cast every element
separately.

Another, even nastier, method - but fast - would be to directly cast the
std::vector<DerivedElem*> & passed to the template member in the base class
into a std::vector<BaseElem*> & for passing to the virtual function.

I probably need a few slaps across the face from other regulars here or I
might come up with something even worse

DW



 
Reply With Quote
 
David White
Guest
Posts: n/a
 
      11-13-2003
"David White" <> wrote in message
news:hzUsb.1260$...
>
> I can't think of any really nice way to do it. The best I can come up with
> is a virtual function that takes a std::vector<BaseElem*> &, and a
> non-virtual member function template in the base class that calls the
> virtual function and converts the vector it creates into another vector of
> the correct type of element using a cast.


To clarify, here I meant casting the address of the first element of
std::vector<BaseElem*>, which is a BaseElem**, into a DerivedElem** for
insertion into the std::vector<DerivedElem*> & passed to the template
function. I didn't mean casting one vector type into another, as it
appeared. (Though I meant exactly that later on.)

DW



 
Reply With Quote
 
 
 
Reply

Thread Tools

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 On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
passing virtual member function to templates g3rc4n@gmail.com C++ 2 03-20-2009 04:23 PM
virtual member function templates dj C++ 5 09-15-2006 06:53 AM
how to Specializations of function Templates or Overloading Function templates with Templates ? recover C++ 2 07-25-2006 02:55 AM
Smart pointers and member function pointers n2xssvv g02gfr12930 C++ 3 11-27-2005 10:51 AM
Can't figure out syntax error with templates/member function pointers Aaron Walker C++ 4 10-01-2005 04:19 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57