ما هو تقطيع الكائنات (object slicing) في C++ وكيفية تجنبه؟
مرحبًا! أنا أتعلم لغة C++ وواجهت مشكلة لا أستطيع فهمها. لدي فئة أساسية `Shape` وفئة مشتقة `Circle`. عندما أمرر كائن `Circle` إلى دالة تقبل `Shape` بالقيمة، أفقد البيانات والسلوك الخاص بـ `Circle`. على سبيل المثال:
```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) { // نستقبل بالقيمة
s.draw();
// std::cout << s.radius; // خطأ! radius غير موجود في Shape
}
int main() {
Circle c;
printShape(c); // يطبع "Drawing Shape"، وليس "Drawing Circle"!
return 0;
}
```
كنت أتوقع أن يتم استدعاء `draw()` من `Circle`، ولكن يتم استدعاء النسخة من `Shape`. بالإضافة إلى ذلك، لا أستطيع الوصول إلى `radius`. على الإنترنت يُسمى هذا "object slicing".