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