ما هو تقطيع الكائنات (object slicing) في C++ وكيفية تجنبه؟
مرحبًا! لقد بدأت مؤخرًا في تعلم لغة C++ وواجهت مشكلة لا أستطيع فهمها. لدي كلاس أساسي `Animal` وكلاس مشتق `Dog` يضيف حقل `breed`. كتبت دالة تأخذ `Animal` بالقيمة. عندما أمرر إليها كائن `Dog`، لا يصدر المترجم خطأ، لكنني في الدالة أفقد بيانات السلالة (حقل `breed`). إليك الكود الخاص بي:
```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