Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > C++ Moderated > Re: Why can't p...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 2 of 9 Topic 9558 of 9828
Post > Topic >>

Re: Why can't pass vector of "Derived" to function that takes vector of "Base"?

by Chris Uzdavinis <cuzdav@[EMAIL PROTECTED] > Apr 28, 2008 at 08:36 PM

On Apr 28, 6:05 pm, Rob <someidunknown1...@[EMAIL PROTECTED]
> wrote:
> I have these cl***** (elided methods):

> And neither of these work:
>
>       /*** ATTEMPT ONE **/
>       void create(std::vector<Base>& arr);
>
>       int main()
>       {
>            std::vector<Derived> arr;
>            create( arr );
>       }

A template instantiated twice, one holding type T1 and the other type
T2, are completely unrelated types according to the rules of the C++
type system.  As such, it's no different than trying to pass a Person
structure to a function expecting a Shape object.

Now logically, you might think that if the relation****p between two
types T1 and T2 are polymorphic, then arrays or vectors of them ought
to be also, but it just isn't so.

Fist, be glad you used a vector and not a raw array (passed as a
pointer) as that *would* compile, and would have devastating results.
Consider the issue: How do you index into an array?  The way it works
is through pointer arithmetic on the size of the array element.

Since an array of N objects of type T live in consecutive memory, the
Ith element is calculated by multiplying the size of T by I, and
adding that offset to the base address of the array.

Now suppose each object of your base class (T1) was 10 bytes in size,
but each derived object (T2) was 24 bytes.  *If* you could use vectors
(or arrays) polymorphically, then element 0 would "line up" since they
both would have the same address, but when you try to access any
element after that, the arithmetic is wrong.  Suppose you index
element 3:

   Let ary_base be the address of element 0 in the array or vector.

   Then:

   calculated address: sizeof(T1)*3 + ary_base ==> 30 + ary_base

   desired address:    sizeof(T2)*3 + ary_base ==> 72 + ary_base

Since ary_base is the same in both cases, we can ignor it, and just
look at the offset to it.  We want 72, we get 30.  See the problem?

This is a well-known problem with arrays, and it extends to vectors
too, except that with vectors you have the benefit of a compile-time
detection of this subtle error, and with arrays you have runtime
failures.  There are many places you can get detailed discussion about
this issue, but the FAQ is a particularly good one:
http://www.para****ft.com/c++-faq-lite/proper-inheritance.html#faq-21.4

Depending on your situation, you can possibly work around this problem
it by changing your create() code into a function template, which
operates on a vector of the actual type you are using:

     template <typename T>
     void create(std::vector<T>& arr)
     {
     // ...
     }

-- 
Chris

      [ See http://www.gotw.ca/resources/clcm.htm
for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]
 




 9 Posts in Topic:
Why can't pass vector of "Derived" to function that takes vector
Rob <someidunknown1234  2008-04-28 16:05:53 
Re: Why can't pass vector of "Derived" to function that takes ve
Chris Uzdavinis <cuzda  2008-04-28 20:36:06 
Re: Why can't pass vector of "Derived" to function that takes ve
Lance Diduck <lancedid  2008-04-28 20:35:36 
Re: Why can't pass vector of "Derived" to function that takes ve
"Hakusa@[EMAIL PROTE  2008-04-28 23:22:39 
Re: Why can't pass vector of "Derived" to function that takes ve
nickf3 <nickf3@[EMAIL   2008-04-28 23:22:53 
Re: Why can't pass vector of "Derived" to function that takes ve
David Pol <david@[EMAI  2008-04-29 10:38:26 
Re: Why can't pass vector of "Derived" to function that takes ve
Brendan Miller <catphi  2008-04-29 10:37:22 
Re: Why can't pass vector of "Derived" to function that takes ve
Anand Hariharan <mailt  2008-04-29 10:44:31 
Re: Why can't pass vector of "Derived" to function that takes ve
Rob <someidunknown1234  2008-04-29 11:13:21 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Thu Jul 24 16:02:27 CDT 2008.