در شیگرایی گاهی میخوایم بگیم یه کلاس یک خاصیت رو داره اما پیادهسازی و نحوهی اجرای اون خاصیت در فرزندانش مشخص میشه. مثلاً کلاسی به نام 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();
};
در حقیقت تابع مجازی تابعی است که اعلانش در کلاس والد و تعریفش در کلاس فرزند وجود داره.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)