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

آموزش مفهوم چندریختی یا Polymorphism در ++C

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

یک موضوع مهم در برنامه نویسی Polymorphism است و در این جلسه ما به بررسی  چندریختی یا Polymorphism در ++C خواهیم پرداخت. واژه چندریختی به معنی داشتن چندین صورت است. معمولاً، چندریختی در شرایطی اتفاق می‌افتد که زنجیره‌ای از کلاس‌ها از طریق وراثت به هم مربوط شده‌اند.

چندریختی در ++C یعنی اینکه  فراخوانی یک تابع عضو، بسته به نوع شی فراخواننده آن، می‌تواند منجر به اجرای توابع مختلفی شود.

مثال زیر را درنظر بگیرید که در آن دو کلاس از یک کلاس پایه مشتق شده‌اند.

مخفی

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

با اجرای این کد، خروجی زیر نتیجه می‌شود.

مخفی

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

علت این خروجی نادرست این است که برای فراخوانی تابع ()area، کامپایلر از ابتدا نسخه تابع در کلاس پایه را انتخاب کرده است. به این حالت وضوح ایستا (static resolution)، فراخوانی تابع  یا اتصال ایستا (static linkage) گفته می‌شود، تابع پیش از فراخوانی قطعی (fixed) شده است. به این حالت همچنین اتصال اولیه (early binding) نیز گفته می‌شود زیرا تابع ()area در زمان کامپایل برنامه تعیین شده است.

اما حالا، اجازه دهید یک تغییر کوچک در برنامه ایجاد کرده و پیش از اعلان تابع ()area در کلاس Shape کلیدواژه virtual را قرار دهیم.

مخفی

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

بعد از اعمال این تغییر جزئی و اجرای کد، خروجی زیر حاصل می‌شود.

مخفی

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

این‌بار، کامپایلر به جای نوع اشاره‌گر به محتوای آن نگاه می‌کند. بنابراین، از آنجایی که آدرس اشیا کلاس‌های tri و rec در shape* ذخیره می‌شود، تابع ()area مربوطه فراخوانی می‌شود.

همانطور که می‌بینید، هر کدام از کلاس‌های فرزند (child class) پیاده‌سازی خاص خود را برای تابع ()area دارند. این شکل عمومی ‌کاربرد چندریختی است. شما چند کلاس مختلف با یک تابع با نام و پارامترهای یکسان، اما پیاده‌سازی‌های متفاوت خواهید داشت.

تابع مجازی (Virtual Function)

یک تابع مجازی (Virtual) تابعی از کلاس پایه است که با کلیدواژه virtual اعلان می‌شود. وجود یک تابع مجازی در کلاس پایه و یک نسخه متفاوت از آن در کلاس مشتق شده، به کامپایلر این نشانی را می‌دهد که برای این تابع از اتصال ایستا استفاده نکند.

آنچه مطلوب ماست انتخاب تابع در هر نقطه از برنامه، براساس نوع شی فراخوانده شده است. به این عملیات اتصال دینامیک (dynamic linkage) یا اتصال متاخر (late binding) گفته می‌شود.

توابع مجازی محض (Pure Virtual Functions)

می‌توان یک تابع مجازی در کلاس پایه را به گونه‌ای تعریف کرد که در خود کلاس پایه هیچ تعریف معنا‌داری نداشته باشد اما در توابع مشتق شده قابل تعریف مجدد باشد.

تابع مجازی ()area را در کلاس پایه به صورت زیر تغییر می‌دهیم.

مخفی

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

عبارت 0 = به کامپایلر اعلام می‌کند که این تابع هیچ بدنه‌ای ندارد. این تابع، تابع مجازی محض (pure virtual function) نامیده می‌شود.

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


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

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

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

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

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

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

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

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

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

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