بسم الله الرحمن الرحيم,
قد يكون الموضوع واضح للكثير و سهل, ولكن بحكم عملي الجامعي ارى الكثير من الاخطأ في هذا الموضوع.
لنبدأ بتعريف ال slicing تعريف بسيط و سيتم فهم معنى هذا المصطلح تماما بعد الشرح, فهو مصطلح يطلق عندما نقوم بتمرير متغير اتشايلد الى متغير بيرنتس في داله. كما هو واضح في المثال هذا
#include <iostream>
using namespace std;
class father
{
public:
void print( )
{
cout<<"father"<<endl;
}
};
class child: public father
{
public:
void print( )
{
cout<<"child"<<endl;
}
};
void printout(father c)
{
c.print();
}
void main()
{
child c;
printout(c);
}بامانه, ماذا تتوقع ناتج هذا الكود بدون عمل كمبايل له.
عارف انك مش حتكون امين :P , و حتعمله كمبايل وحتجد الناتج father
وطبعا هذا ليس هو المطلووووووب.........
لحل المشكله البسيطه عليك بالاتي
1) كتابت كلمة virtual قبل الداله الموجوده في كلاس البيرنتس.
2) وهذه ينساها الكثير و انا اولهم :D , وهي علامة & قبل المتغير في الداله.
ليصبح برنامجنا بهذا الشكل:
#include <iostream>
using namespace std;
class father
{
public:
virtual void print()
{
cout<<"father"<<endl;
}
};
class child: public father
{
public:
void print()
{
cout<<"child"<<endl;
}
};
void printout(father & c)
{
c.print();
}
void main()
{
child c;
printout(c);
}
طبعا الان اعمل كمبايل و حتلاقي انه الجواب هو child, عجيــــــــــــــــــــب صح :)
قد يتسأل البعض ماهو المصطلح virtual, وقد يجيب البعض بانه مصطلح خاص لحل مشكلة ال slicing , وانا اتوافق معهم.
ارجو ان يكون مصطلح slicing واضح الان, و إن شاء الله لا اريد ابدا ان ارى احد من شبابنا يقع في هذه المشكله.
ارجوا ان تعم الفائده ...