slicing - copying or assigning derived object to base object

Discussion in 'C++' started by subramanian100in@yahoo.com, India, Apr 22, 2008.

  1. , India

    , India Guest

    Consider

    class Base
    {
    ....
    };

    class Derived : public Base
    {
    ...
    };

    Derived d_obj;

    As per my understanding, slicing happens in the following scenarios
    and they should be avoided. However my question is, will we ever
    require one of the following scenarios?

    1) Will there be any need to instantiate Base like
    Base b_obj(d_obj); // derived object sliced down to base object

    2) Will there be any need to assign like
    b_obj = d_obj; // again derived object sliced down to base object

    3) void fn(Base base_obj_arg)
    {
    ...
    }

    fn(d_obj); // slicing happens here

    4) Base fn(const Derived& arg)
    {
    return arg;
    }

    Base temp = fn(d_obj); // again slicing happens here.


    What I am trying to say is, if the above four scenarios are avoided,
    slicing will not happen. However will there be any need for one of the
    above four scenarios to be used as mandatory ?

    Kindly explain.

    Thanks
    V.Subramanian
    , India, Apr 22, 2008
    #1
    1. Advertising

  2. ", India" <> writes:

    > Consider
    >
    > class Base
    > {
    > ...
    > };
    >
    > class Derived : public Base
    > {
    > ..
    > };
    >
    > Derived d_obj;
    >
    > As per my understanding, slicing happens in the following scenarios
    > and they should be avoided. However my question is, will we ever
    > require one of the following scenarios?
    >
    > 1) Will there be any need to instantiate Base like
    > Base b_obj(d_obj); // derived object sliced down to base object
    >
    > 2) Will there be any need to assign like
    > b_obj = d_obj; // again derived object sliced down to base object
    >
    > 3) void fn(Base base_obj_arg)
    > {
    > ...
    > }
    >
    > fn(d_obj); // slicing happens here
    >
    > 4) Base fn(const Derived& arg)
    > {
    > return arg;
    > }
    >
    > Base temp = fn(d_obj); // again slicing happens here.
    >
    >
    > What I am trying to say is, if the above four scenarios are avoided,
    > slicing will not happen. However will there be any need for one of the
    > above four scenarios to be used as mandatory ?



    There's not really a NEED to slice. But this could be something
    somebody might want to do. I wouldn't advise doing it, but still.

    Imagine a 3D editor. You could have a graphic card processor that
    would expect data as:

    class Point { public: int x; int y; };

    but while editing 3D models, the application may want to attach
    attributes to the points:

    class EditorPoint: public Point {
    std::string name;
    DateTime dateCreated;
    User* lastModifier;
    // ...
    };


    So this 3D editor will work with EditorPoints, with a lot of data, but
    just before sending these points to the graphic card to be rendered on
    the screen, it would slice the EditorPoints down to Points:

    std::vector<EditorPoint> ep;
    std::vector<Point> gp(ep.size());

    copy(ep.begin(),ep.end(),gp.begin());




    Of course, one could argue that it would be saner to do

    Point& EditorPoint::convertToGraphicCardPoint(void){
    return Point(this->x,this->y);
    }

    transform(ep.begin(),ep.end(),gp.begin(),
    boost::bind(EditorPoint::convertToGraphicCardPoint,_1));

    But the binary code executed should be very close or even identical in
    both cases, I'd say.



    --
    __Pascal Bourguignon__
    Pascal J. Bourguignon, Apr 22, 2008
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. qazmlp
    Replies:
    1
    Views:
    556
    qazmlp
    Apr 10, 2005
  2. Stephan Hoffmann
    Replies:
    2
    Views:
    613
    Stephan Hoffmann
    Dec 11, 2005
  3. Replies:
    4
    Views:
    392
    Alf P. Steinbach
    May 23, 2007
  4. Replies:
    1
    Views:
    387
    myork
    May 23, 2007
  5. Replies:
    1
    Views:
    374
    Victor Bazarov
    May 23, 2007
Loading...

Share This Page