Qu'est-ce que le slicing d'objets (object slicing) en C++ et comment l'éviter ?
Bonjour ! J'ai récemment commencé à apprendre le C++ et j'ai rencontré un problème que je n'arrive pas à comprendre. J'ai une classe de base `Animal` et une classe dérivée `Dog`, qui ajoute un champ `breed`. J'ai écrit une fonction qui prend un `Animal` par valeur. Quand je lui passe un objet `Dog`, le compilateur ne génère pas d'erreur, mais dans la fonction, je perds les données sur la race (champ `breed`). Voici mon code :
```cpp
#include
#include
class Animal {
public:
Animal(const std::string& name) : name_(name) {}
virtual void speak() const { std::cout << "Animal sound\n"; }
std::string getName() const { return name_; }
private:
std::string name_;
};
class Dog : public Animal {
public:
Dog(const std::string& name, const std::string& breed)
: Animal(name), breed_(breed) {}
void speak() const override { std::cout << "Woof!\n"; }
std::string getBreed() const { return breed_; }
private:
std::string breed_;
};
void printAnimal(Animal a) { // Pr