رفتن به مطلب
برنامه نویسی من
Mostafa

آموزش تابع مجازی (virtual function) در ++C

پست های پیشنهاد شده

یک مثال برای شروع

فرض کنید روی یک بازی (جنگی) کار می‌کنیم. کلاس Weapon را ایجاد می‌کنیم و دو کلاس Bomb و Gun را از آن مشتق می‌کنیم تا ویژگی‌های این سلاح‌ها را در آن‌ها بارگذاری کنیم:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

خروجی

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

سه شیء اشاره‌گر به نام‌های w ،b و g را به ترتیب برای کلاس‌های Weapon ،Bomb و Gun تعریف می‌کنیم. همچنین تابع عضو ()loadFeatures را برای هر شیء با استفاده از کدهای زیر فراخوانی می‌کنیم:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

تا این جا همه چیز به خوبی کار می‌کند، با این حال پروژه بازی ما رفته‌رفته بزرگ‌تر می‌شود و تصمیم می‌گیریم کلاس مجزای Loader را برای بارگذاری ویژگی‌های سلاح‌ها ایجاد کنیم. این کلاس Loader ویژگی‌های دیگری از سلاح‌ها را بسته به نوع سلاح انتخابی بارگذاری می‌کند.

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

()loadFeatures ویژگی یک سلاح خاص را بارگذاری می‌کند.

پیاده‌سازی کلاس Loader

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

خروجی

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

پیاده‌سازی ما درست به نظر می‌رسد؛ اما ویژگی‌های سلاح‌ها 4 بار بارگذاری شده است. دلیل این مسئله آن است که در ابتدا شیء سلاح w به شیء کلاس b (یا Bomb) اشاره می‌کرد و تلاش کرده‌ایم ویژگی‌های شیء Bomb را با ارسال آن به تابع ()loadFeatures با استفاده از شیء اشاره‌گر l (کلاس Loader) بارگذاری کنیم. به طور مشابه تلاش کرده‌ایم ویژگی‌های شیء Gun را نیز بارگذاری کنیم، اما تابع ()loadFeatures کلاس Loader اشاره‌گر به شیء کلاس Weapon را به عنوان آرگومان می‌گیرد:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

به همین جهت است که ویژگی‌های weapon 4 بار بارگذاری می‌شوند. برای حل این مشکل باید تابعی از کلاس مبنا (کلاس Weapon) به صورت مجازی با استفاده از کلیدواژه virtual بسازیم.

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

مثال: استفاده از تابع مجازی برای حل مشکل

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

خروجی

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

همچنین توجه کنید که تابع l->loadFeatures(w) تابع کلاس‌های مختلفی را بسته به این که شیء l به چه چیزی اشاره می‌کند فرامی‌خواند.

استفاده از تابع مجازی نه‌تنها موجب شده کد ما روشن‌تر شود، بلکه انعطاف‌پذیری آن را نیز افزایش داده است. در برنامه فوق، ویژگی‌های سلاح دو بار پرینت شده‌اند. با افزودن کد بیشتر می‌توانید کاری کنید که ویژگی‌های سلاح تنها یک بار بارگذاری شود. اگر بخواهیم سلاح دیگری (مانند چاقو) اضافه می‌کنیم می‌توانیم به سادگی ویژگی‌های آن را به صورت زیر اضافه کرده و بارگذاری کنیم.

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

و در تابع ()main به صورت زیر عمل می‌کنیم:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

لازم به ذکر است که ما برای بارگذاری ویژگی‌های چاقو، هیچ چیز را در کلاس Loader تغییر نداده‌ایم.

کلاس مجرد در ++C و تابع مجازی خالص

هدف برنامه‌نویسی شیءگرا، تقسیم کردن یک مسئله پیچیده به مجموعه‌های کوچک‌تر است. بدین ترتیب می‌توانیم مسئله را به روشی بهینه درک کرده و حل کنیم.

برخی اوقات استفاده از وراثت صرفاً به منظور بصری‌سازی بهتر مسئله مفید خواهد بود. در ++C می‌توان یک کلاس مجرد ایجاد کرد که امکان وهله‌سازی از آن وجود نداشته باشد، یعنی نمی‌توان شیئی از روی این کلاس مجرد ساخت. با این حال می‌توان از آن کلاس دیگری مشتق کرد و شیئی را از آن کلاس مشتق شده وهله‌سازی نمود.

کلاس‌های مجرد کلاس‌های مبنایی هستند که وهله‌سازی نمی‌شوند. یک کلاس شامل تابع مجازی خالص به نام کلاس مجرد نامیده می‌شود.

تابع مجازی خالص

یک تابع مجازی که اعلان آن با =0 پایان یابد یک تابع مجازی خالص است. به مثال زیر توجه کنید:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

در این کد تابع مجازی به صورت زیر است:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

و کلاس Weapon یک کلاس مجرد است.

مثال: کلاس مجرد و تابع مجازی خالص

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

خروجی

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

در این برنامه، تابع مجازی خالص زیر درون کلاس Shape تعریف شده است:

مخفی

    برای مشاهده مطلب باید در سایت ثبت نام کنید و سپس وارد شوید.

یک نکته که باید اشاره کنیم این است که تابع مجازی خالص کلاس مبنا باید در کلاس مشتق شده باطل (Override) شود. اگر این کار صورت نگیرد، کلاس مشتق شده خود به یک کلاس مجرد تبدیل می‌شود. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

×
×
  • اضافه کردن...