On 2009-02-08 23:43:13 -0500, Weed <[email protected]> said:
Michel Fortin пишет:
On 2009-02-08 09:30:08 -0500, Weed <[email protected]> said:
Let's assume, polymorphism is necessary to these objects
Polymorphism doesn't work very well while passing objects by value, even
in C++. This is called the slicing problem.
<http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c>
I think D does a good job at avoiding that problem.
By performance loss
:(
No. By forbiding the cases that leads to slicing, like returning a
polymorphic object by value.
Returning something by-value always cause slicing in C++. Try this C++ code:
#include <iostream>
class A {
public:
virtual void hello() { std::cout << "hello from A" <<
std::endl; }
};
class B : public A {
public:
virtual void hello() { std::cout << "hello from B" <<
std::endl; }
};
A test() {
B b;
b.hello(); // prints "hello from B"
return b;
}
int main() {
test().hello(); // prints "hello from A"
A a = test();
a.hello(); // prints "hello from A"
}
Here, returning B by value "slices" the object, transforming it into a
A. There is absolutely no polymorphic behaviour when returning by
value. It's as if virtual functions weren't virtual at all: your B
object is transformed to a A when it is returned.
To preserve polymorphism, you need to return a pointer or a reference,
but then test() can't allocate the object on the stack.
--
Michel Fortin
[email protected]
http://michelf.com/