در شیگرایی گاهی میخوایم بگیم یه کلاس یک خاصیت رو داره اما پیادهسازی و نحوهی اجرای اون خاصیت در فرزندانش مشخص میشه. مثلاً کلاسی به نام shape
داریم که عملی برای رسم در صفحه نمایش به نام draw
براش در نظر میگیریم. بدیهی هست که برای کلاس shape
به صورت کلی نمیشه عمل draw
رو پیادهسازی کرد.
class Shape
{
public:
Shape(){};
~Shape(){};
};
اما در صورتی که دو فرزند زیر از کلاس Shape
مشتق شده باشند، برای اونها میشه عمل draw
رو پیادهسازی کرد.
class Rectangle : public Shape
{
public:
Rectangle(){};
~Rectangle(){};
void draw(){ ... };
};
class Circle : public Circle
{
public:
Circle(){};
~Circle(){};
void draw(){ ... };
};
در این حالت تابع draw
رو در کلاس والد به صورت مجازی تعریف میکنیم که مشخص بشه پیادهسازی اون در فرزندها اتفاق میافته و اینجا برای توضیح هست.
class Shape
{
public:
Shape(){};
~Shape(){};
virtual void draw();
};
در حقیقت تابع مجازی تابعی است که اعلانش در کلاس والد و تعریفش در کلاس فرزند وجود داره.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)