Avatar ·

O que é object slicing em C++ e como evitá-lo?

Olá! Estou estudando C++ e me deparei com um problema que não consigo entender. Tenho uma classe base `Shape` e uma classe derivada `Circle`. Quando passo um objeto `Circle` para uma função que recebe `Shape` por valor, perco os dados e o comportamento específicos de `Circle`. Por exemplo: ```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) { // Recebe por valor s.draw(); // std::cout << s.radius; // Erro! radius não existe em Shape } int main() { Circle c; printShape(c); // Imprime "Drawing Shape", não "Drawing Circle"! return 0; } ``` Eu esperava que `draw()` fosse chamado de `Circle`, mas a versão de `Shape` é chamada. Além disso, não consigo acessar `radius`. Na internet, isso é chamado de "object slicing".