Avatar ·

¿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".