کلمه کلیدی virtual برای اصلاح متد، پراپرتی، شاخصگر یا اعلان رویداد استفاده می شود و به آنها اجازه می دهد که در کلاس مشتق شده رونویسی (override) شوند. برای مثال، این متد می تواند توسط هر کلاسی که از آن ارث بری می کند، رونویسی شود.
پیاده سازی یک عضو مجازی (virtual) را می توان توسط عضو رونویسی کننده در یک کلاس مشتق شده، عوض کرد.
ملاحظات
وقتی یک متد مجازی فراخوانی می شود، نوع زمان-اجرای آن شیئ برای عضو رونویسی کننده بررسی می شود. عضو رونویسی کننده، در کلاس مشتق شده فراخوانی می شود، که ممکن است همان عضو اصلی باشد (اگر هیچ کلاس مشتق شده ای، آن عضو را رو نویسی نکرده باشد).
بطور پیش فرض، متدها غیر-مجازی هستند. شما نمی توانید متد غیر مجازی را رونویسی کنید.
شما نمی توانید از اصلاحگر virtual به همراه اصلاحگرهای static، abstract، private یا override استفاده کنید. مثال زیر یک پراپرتی مجازی را نشان می دهد:
متدهای مجازی مانند متدهای چکیده (abstract) رفتار می کنند، به استثناء تفاتهایی که در املاء اعلان و احضار آنها وجود دارد.
- استفاده از اصلاحگر virtual روی یک پراپرتی static خطا محسوب می شود.
- یک پراپرتی ارث بری شده ی مجازی، می تواند با ضمیمه کردن یک اعلان پراپرتی که از اصلاحگر override استفاده می کند، در یک کلاس مشتق شده رونویسی شود.
مثال
در این مثال، کلاس Dimensions حاوی دو مختصات x و y و متد مجازی()Area می باشد. کلاس شکل های مختلف از جمله دایره (Circle)، سیلندر (Cylinder) و کره (Sphere) از کلاس Dimensions ارث بری می کنند و مساحت سطح برای هر کدام از اشکال محاسبه می شود. هر کدام از کلاس های مشتق شده، پیاده سازی مخصوص به خود را برای متد Area() دارند. برنامه مطابق شیئی که به متد()Area پیوست شده ، با احضار کردن پیاده سازی مناسب از()Area مساحت مناسب را برای هر شکل محاسبه و نمایش می دهد.
توجه کنید که کلاس های ارث بری شده Circle ، Sphere و Cylinder همه از سازنده هایی (Constructor) که کلاس پایه را مقداردهی اولیه می کنند، استفاده می کنند، برای مثال:
این کار شبیه لیست مقداردهی اولیه در ++C می باشد.