advertise laitec sharif univercity
دانلود سورس اندروید اپلیکیشن افزایش سرعت گوشی

دانلود سورس اندروید اپلیکیشن افزایش سرعت گوشی

18000 تومان
دانلود برنامه رنگ آمیزی گراف با الگوریتم عقبگرد در سی شارپ

دانلود برنامه رنگ آمیزی گراف با الگوریتم عقبگرد در سی شارپ

10000 تومان
دانلود مقاله ای در مورد الگوریتم  کرم شب تاب FireFly در هوش مصنوعی

دانلود مقاله ای در مورد الگوریتم کرم شب تاب FireFly در هوش مصنوعی

10000 تومان
دانلود سورس پروژه سی شارپ شبیه سازی صف بانک تحت شبکه

دانلود سورس پروژه سی شارپ شبیه سازی صف بانک تحت شبکه

10000 تومان
دانلود سورس پروژه TSP با الگوریتم مورچگان Ants

دانلود سورس پروژه TSP با الگوریتم مورچگان Ants

10000 تومان

توابع مجازی و چند ریختی در زبان سی پلاس پلاس ++C

با توابع مجازی و چند ریختی میتوان سیستم هایی طراحی و پیاده سازی کرد که به آسانی قابل توسعه باشند. چندریختی هم در زمان ترجمه و هم در زمان اجرا در C++ امکان پذیر است
توابع مجازی و چند ریختی در زبان سی پلاس پلاس ++C

توابع مجازی و چند ریختی در زبان سی پلاس پلاس ++C

با توابع مجازی و چند ریختی میتوان سیستم هایی طراحی و پیاده سازی کرد که به آسانی قابل توسعه باشند. چندریختی هم در زمان ترجمه و هم در زمان اجرا در C++ امکان پذیر است. چندریختی زمان ترجمه با تعریف مجدد توابع و عملگرها صورت میگیرد و چندریختی زمان اجرا، با استفاده از وراثت و توابع مجازی انجام میشود.

تابع مجازی یک تابع عضو است که در یک کلاس پایه اعلان میشود و دوباره در کلاس مشتق تعریف میگردد. کلاس هایی از اشیا مانند circle، triangle، rectengle، squre و غیره را که همگی از کلاس shape مشتق شده اند در نظر بگیرید. در برنامه نویسی شی گرا میتوان قابلیتی را به هر کدام از این کلاس ها اضافه کرد که خودشان را رسم کنند. تابعی که شکل را رسم میکند draw می نامیم. گرچه هر یک از این کلاس ها، تابع draw مخصوص به خود دارند، ولی این تابع برای هر شکل متفاوت است. هنگام رسم شکل اگر بتوان با همه آنها مثل اشیایی از کلاس shape برخورد کرد، بسیار عالی خواهد بود. در این صورت برای رسم شکل میتوان تابع draw از کلاس پایه shape را فراخوانی کرد و به برنامه اجازه داد خودش تشخیص دهد که از کدام تابع draw از کلاس مشتق استفاده کند. برای انجام چنین کاری تابع draw را در کلاس پایه بصورت virtual (تابع مجازی) تعریف کرده هر یک از توابع موجود در کلاس های مشتق را با اعضای جدیدی می نویسیم تا شکل مناسب را رسم کند. برای اعلان یک تابع مجازی کافیست در جلوی نام آن کلمه virtual را ذکر کرد.

وقتی کلاسی از یک کلاس پایه با تابع مجازی مشتق میشود، کلاس مشتق، آن تابع را طوری در خودش تعریف میکند که نیازهای خودش را برطرف کند. بطور کلی توابع مجازی فلسفه " یک واسط چند متد" را که مربوط به چندریختی است پیاده سازی میکند.

هنگامیکه تابع مجازی بطور عادی دستیابی میشود، همچون سایر توابع عضو عمل میکند، اما آنچه تابع مجازی را با اهمیت جلوه میدهد و موجب پشتیبانی چندریختی در زمان اجرا میشود، چگونگی رفتار آنها در هنگام دسترسی از طریق اشاره گر است. اشاره گر کلاس پایه میتواند برای اشاره کردن به هر شیءی از هر کلاسی که از آن مشتق میشود، به کار گرفته شود. وقتی اشاره گر پایه به شی مشتقی اشاره میکند که حاوی تابع مجازی است، C++ تعیین میکند که کدام نسخه از آن تابع باید فراخوانی شود. این کار را با توجه به نوعی از شی که اشاره گر به آن اشاره میکند، انجام میدهد. این کار در زمان اجرا انجام میشود. بنابراین وقتی به اشیایی با انواع گوناگون اشاره شود، نسخه های گوناگونی از تابع مجازی اجرا میشوند. این موضوع در مورد مرجع های کلاس پایه نیز صادق است.

بنابراین اگر اشیایی از کلاس های مختلف، که از طریق وراثت با هم ارتباط دارند، این توانایی را داشته باشند که به یک پیام پاسخ های متفاوتی بدهند، چندریختی به وجود می آید.

 

فراخوانی تابع مجازی از طریق کلا پایه

مرجع، یک اشاره گر ضمنی است. بنابراین مرجع کلاس پایه میتواند به شیئی از کلاس پایه یا هر شیئی از کلاسی که از پایه مشتق شد، اشاره کند. وقتی تابع مجازی بوسیله مرجع کلاس پایه فراخوانی میشود، نسخه ای از تابع که اجرا میگردد با توجه به شیئی که در هنگام فراخوانی به آن مراجعه میکند، تعیین میشود. متداول ترین حالتی که تابع مجازی از طریق مرجع کلاس پایه فراخوانی میشود، وقتی است که مرجع به عنوان پارامتر تابع است.

 

صفت مجازی، موروثی است

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

 

توابع مجازی سلسله ماتبی اند

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

 

توابع مجازی محض

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

تابع مجازی محض نوعی تابع مجازی است که در کلاس پایه تعریف نشده باشد. برای اعلان تابع مجازی محض، از شکل کلی زیر استفاده میشود:

; 0 = (لیست پارامترها)   نام تابع     نوع virtual

وقتی تابع مجازی بصورت محض باشد، هر کلاس مشتق باید تعریف خاص خودش را ارائه کند. اگر کلاس مشتقی نتواند تابع مجازی را برای خودش تعریف کند، کامپایلر خطایی را اعلان میکند.

 

کلاس های انتزاعی

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

 

 



4
نظرات
  • user avatar saba:
    ۱۲:۱۴:۳۷ __ ۱۳۹۴/۱۰/۱۲

    خوب بود.

  • user avatar hsn:
    ۱۷:۵۷:۱۶ __ ۱۳۹۶/۰۲/۱۷

    سلام،خیلی ممنون.کاشکی یه مثال هم میزدید.:)

  • user avatar saeed:
    ۰۲:۱۷:۰۵ __ ۱۳۹۶/۰۳/۰۳

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

  • user avatar Angel:
    ۲۱:۴۷:۳۹ __ ۱۳۹۷/۰۳/۲۸

    سلام. خسته نباشید بنظرم اگه یه سورس کدی هم برای مثال بزارید عالی میشه.

نظر خود را ارسال کنید



نام:
ایمیل:
دیدگاه:
captcha
کد امنیتی :


advertise
توابع مجازی سلسله مراتبی اندتابع مجازی در سی پلاس پلاستابع مجازی یک تابع عضو استصفت مجازی، موروثی استتوابع مجازی و چندریختی در ++Cکلاس های انتزاعی در چند ریختیتوابع مجازی و چند ریختی در زبان ++Cفراخوانی تابع مجازی از طریق کلاس پایهتوابع مجازی در ++Cتوابع مجازی محض لیست برچسب ها
تمامی حقوق این سایت اعم از محتوی ، تصاویر ، قالب و ... متعلق به گروه مهندسی وب سایت سورس کد می باشد.
SourceCodes.ir ، افقی روشن برای برنامه نویسان ، از مبتدی تا حرفه ای

پیشنهادات ویژه سورس کد

پکیج ویژه پروژه پایانی رشته کامپیوتر دانلود مجموعه 70 پروژه کاربردی سی شارپ وب سایت فروشگاه با php