توابع مجازی (Virtual Functions)
«توابع مجازی (Virtual Functions)» یعنی تابعی در کلاس پایه که فرزند می تواند آن را بازنویسی کند. «بازنویسی (Override)» یعنی همان نام تابع را در کلاس فرزند، جور دیگر اجرا کنیم. با این کار چندریختی کار می کند. یعنی یک صدا می زنیم، اما هر شیء جواب خودش را می دهد.
چرا توابع مجازی مهم اند؟
بدون virtual، برنامه بر اساس «نوع اشاره گر» تصمیم می گیرد. با virtual، بر اساس «نوع واقعی شیء» تصمیم می گیرد. مثل مدرسه: معلم را صدا می زنی؛ اگر عمومی باشد، همه یکسان پاسخ می دهند. اگر مجازی باشد، هر معلم درس خودش را پاسخ می دهد.
- بدون virtual: تابع پایه اجرا می شود.
- با virtual: تابع فرزند اجرا می شود.
مثال بدون تابع مجازی
class Animal {
public:
void sound() {
cout << "Animal sound\n";
}
};
class Dog : public Animal {
public:
void sound() {
cout << "Dog barks\n";
}
};
int main() {
Animal* a;
Dog d;
a = &d;
a->sound();
return 0;
}
اگرچه a به Dog اشاره می کند، اما چون virtual نیست، Animal::sound() اجرا می شود.
مثال با تابع مجازی
class Animal {
public:
virtual void sound() {
cout << "Animal sound\n";
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Dog barks\n";
}
};
int main() {
Animal* a;
Dog d;
a = &d;
a->sound();
return 0;
}
نکته: virtual را در کلاس پایه بگذار. در کلاس فرزند از override برای شفافیت استفاده کن.
اپراتور → برای اشاره گرها
اپراتور -> برای دسترسی از طریق اشاره گر است. این کوتاه شده (*pointer).member است.
Animal* a = new Animal();
a->sound();
گام های تمرینی
- کلاس پایه بساز و تابع را virtual کن.
- کلاس فرزند بساز و تابع را بازنویسی کن.
- یک اشاره گر از نوع پایه بساز.
- آن را به شیء فرزند وصل کن.
- تابع را صدا بزن و خروجی را ببین.
نکته: با virtual، خروجی بر اساس نوع واقعی شیء است.
مطالعه بیشتر
برای ادامه مسیر ببین: چندریختی در C++ و آشنایی با اشاره گرها. همچنین موضوع وراثت در C++ نیز مرتبط است. اگر تازه کاری، از همین صفحه «توابع مجازی» شروع کن.
جمع بندی سریع
- توابع مجازی، بازنویسی را فعال می کنند.
- بدون virtual، تابع پایه اجرا می شود.
- با virtual، تابع فرزند اجرا می شود.
->برای دسترسی با اشاره گر است.- از
overrideبرای شفافیت استفاده کن.