Avatar ·

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