¿Qué es el object slicing en C++ y cómo evitarlo?
¡Hola! Estoy aprendiendo C++ y me encontré con un problema que no puedo entender. Tengo una clase base `Shape` y una clase derivada `Circle`. Cuando paso un objeto `Circle` a una función que acepta `Shape` por valor, pierdo los datos y el comportamiento específicos de `Circle`. Por ejemplo:
```cpp
#include
#include
class Shape {
public:
virtual void draw() const { std::cout << "Drawing Shape\n"; }
};
class Circle : public Shape {
public:
void draw() const override { std::cout << "Drawing Circle\n"; }
double radius = 5.0;
};
void printShape(Shape s) { // Aceptamos por valor
s.draw();
// std::cout << s.radius; // ¡Error! radius no está en Shape
}
int main() {
Circle c;
printShape(c); // Imprime "Drawing Shape", ¡no "Drawing Circle"!
return 0;
}
```
Esperaba que `draw()` se llamara desde `Circle`, pero se llama la versión de `Shape`. Además, no puedo acceder a `radius`. En internet llaman a esto "object slicing".