471,072 Members | 1,394 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,072 software developers and data experts.

slicing - copying or assigning derived object to base object

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
Jun 27 '08 #1
1 2607
"su**************@yahoo.com, India" <su**************@yahoo.comwrites:
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<EditorPointep;
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__
Jun 27 '08 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

8 posts views Thread by Bryan Parkoff | last post: by
21 posts views Thread by Matteo Settenvini | last post: by
17 posts views Thread by Jon Slaughter | last post: by
6 posts views Thread by SureshKumar.PP | last post: by
17 posts views Thread by baibaichen | last post: by
19 posts views Thread by AlesD | last post: by
1 post views Thread by Bart Simpson | last post: by
2 posts views Thread by Rahul | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.