في الشفرة التي قدمتها، تواجه مشكلة في استدعاء دالة toString()
المناسبة بسبب أن الدالة scan()
تعيد قيمة من نوع A
، وبالتالي ستستدعي toString()
من A
حتى لو كانت القيمة التي تم إنشاؤها من نوع B
. لحل هذه المشكلة، يمكنك استخدام مؤشر أو مرجع بوليمورفي للقيام بذلك. إليك كيف يمكن تعديل الشفرة لتحقيق هذا:
cpp#include
#include
class A
{
public:
virtual std::string toString()
{
return "A";
}
};
class B : public A
{
public:
int extraThingToPrint;
std::string toString() override
{
return "B";
}
};
class otherClass
{
public:
std::unique_ptr scan()
{
if (otherVar == 'a')
return std::make_unique();
else if (otherVar == 'b')
return std::make_unique();
else
return nullptr;
}
private:
char otherVar = 'b'; // لغرض التجربة، يمكنك تعديل هذا المتغير وفقاً لاحتياجاتك
};
int main()
{
otherClass obj;
std::unique_ptr ptr = obj.scan();
if (ptr)
std::cout << ptr->toString() << std::endl;
return 0;
}
ملحوظة: تأكد من استخدام الكلمة الرئيسية virtual
لدالة toString()
في A
للسماح بالاستدعاء البوليمورفي لهذه الدالة، واستخدام الكلمة الرئيسية override
في B
للإشارة إلى أنها تعيد تعريف دالة موجودة في الفئة الأساسية.
المزيد من المعلومات
بالطبع! في الكود الذي قمت بتقديمه، يتم استخدام المفهوم الأساسي للوراثة في لغة C++. هذا يعني أنه يمكن لفئة مشتقة مثل B
أن ترث السلوك والخصائص من الفئة الأساسية A
، وبالتالي يمكن لـB
تعديل أو استبدال سلوك الوظائف التي تمتلكها A
بنسخها الخاصة.
في هذه الحالة، قمت بتعريف دالة toString()
كـvirtual
في A
وقمت بتجاوزها (override
) في B
، مما يعني أن دالة toString()
في B
ستتم استدعاؤها عندما يتم استدعاء toString()
على كائن من نوع B
، بينما سيتم استدعاء toString()
في A
عندما يتم استدعاء toString()
على كائن من نوع A
.
بالإضافة إلى ذلك، قمت باستخدام std::unique_ptr
لإدارة الذاكرة لكائنات A
و B
، مما يعني أن الذاكرة التي تم تخصيصها لهذه الكائنات ستتم إعادتها تلقائيًا عندما تنتهي نطاق الحياة للمؤشرات عليها، وهذا يساعد في تجنب تسريب الذاكرة.