متدهای مجازی

متدهای مجازی متدهایی از کلاس پایه هستند که می توان به وسیله یک متد از کلاس مشتق آنها را override کرده و به صورت دلخواه پیاده سازی نمود. به عنوان مثال شما متد A را در کلاس A دارید و کلاس B از کلاس A ارث بری می کند، در این صورت متد A در کلاس B در دسترس خواهد بود. اما متد A دقیق همان متدی است که از کلاس A به ارث برده شده است. حال اگر بخواهید که این متد رفتار متفاوتی از خود نشان دهد چکار می کنید؟ متد مجازی این مشکل را برطرف می کند. به تکه کد زیر توجه کنید :

   1: #include <iostream>
   2: using namespace std;
   3: 
   4: class Parent
   5: {
   6:     public:
   7:         virtual void ShowMessage()                
   8:         {                                         
   9:            cout << "Message from Parent." << endl;
  10:         }                                         
  11: };
  12: 
  13: class Child : Parent
  14: {
  15:     public:
  16:         void ShowMessage()                        
  17:         {                                         
  18:             cout << "Message from Child.";        
  19:         }                                         
  20: };
  21: 
  22: int main()
  23: {
  24:     Parent myParent;
  25:     Child myChild;
  26: 
  27:     myParent.ShowMessage();
  28:     myChild.ShowMessage();
  29: }
Message from Parent.
Message from Child.

متد مجازی با قرار دادن کلمه کلیدی virtual هنگام تعریف متد، تعریف می شود.(خط 7) این کلمه کلیدی نشان می دهد که متد می تواند override شود یا به عبارت دیگر می تواند به صورت دیگر پیاده سازی شود . کلاسی که از کلاس Parent ارث می برد شامل متدی است که متد مجازی کلاس پایه را override یا به صورت دیگری پیاده سازی می کند. با استفاده از نام کلاس والد و علامت :: (خط 18) می توانید متد مجازی را در داخل متد override شده فراخوانی کنید :

   1: #include <iostream>
   2: using namespace std;
   3: 
   4: class Parent
   5: {
   6:     public:
   7:         virtual void ShowMessage()
   8:         {
   9:            cout << "Message from Parent." << endl;
  10:         }
  11: };
  12: 
  13: class Child : Parent
  14: {
  15:     public:
  16:         void ShowMessage()
  17:         {
  18:             Parent::ShowMessage();
  19:             cout << "Message from Child.";
  20:         }
  21: };
  22: 
  23: int main()
  24: {
  25:     Parent myParent;
  26:     Child myChild;
  27: 
  28:     myParent.ShowMessage();
  29:     myChild.ShowMessage();
  30: }
Message from Parent.
Message from Parent.
Message from Child.