Qu'est-ce que le slicing d'objets (object slicing) en C++ et comment l'éviter ?
Bonjour ! J'apprends le C++ et j'ai rencontré un problème que je ne comprends pas. J'ai une classe de base `Shape` et une classe dérivée `Circle`. Lorsque je passe un objet `Circle` à une fonction qui prend `Shape` par valeur, je perds les données et le comportement spécifiques à `Circle`. Par exemple :
```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) { // Prise par valeur
s.draw();
// std::cout << s.radius; // Erreur ! radius n'existe pas dans Shape
}
int main() {
Circle c;
printShape(c); // Affiche "Drawing Shape", pas "Drawing Circle" !
return 0;
}
```
Je m'attendais à ce que `draw()` soit appelé depuis `Circle`, mais c'est la version de `Shape` qui est appelée. De plus, je ne peux pas accéder à `radius`. Sur Internet, cela s'appelle "object slicing".