کاربرد virtual در ++c


کاربرد virtual در ++c



با سلام
می خواستم بدونم وقتی تو ++c کلاس مشتق شده ای از کلاس اصلی را ازنوع virtual تعریف کنیم این چه معنی داره؟
اگه توضیح کلی در مورد استفاده از virtualدر تعریف توابع و کلاس ها بدین ممنون می شم.



برنامه اي ساده براي ايجاد منو

1:

باسلام اگه می شه بگین دقیقا( extern "C" __declspec(dllexport به چه منظوری به کار می ره؟


یه سوال

2:

از این دستور برای ساختن dll هستفاده می شود.


سي شارپ و sql
این دستور این مطلب را می گوید که از بیرون dll فقط این توابع دیده می شوند.
به مثال زیر توجه کنید:

فایل سرآمد dlltest.h
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
فایل سورس dlltest.cpp
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر این دو فایل را در MS VC++ به یک پروژه از نوع Win32 Dynamic-Link Library اضافه کنی سپس کامپایل dll به شما داده می شود.

برای دیدن کاربردهای dllimport و dllexport به سایت مایکروسافت سری بزنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
برای دیدن نحوِۀ ساختن dll به لینک زیر مراجعه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]


فردا امتحان دارم....

3:

توابع مجازی در C++:
وقتی یک تابع را به صورت مجازی تعریف می کنیم که نیاز باشد که برای هر کلاس مشتق شده کد متفاوتی اجرا شود.


برنامه ++c
معمولاً برای چندریختی (Polymorphism) کاربرد دارد.
مثال: چند نژاد از سگ ها را در نظر بگیرید.


رادیکال با فرجه بیشتر در ++c
همۀ اون ها نوعی سگند.


بازی شطرنج( اسب)
همۀ اون ها نیز به شکل خاصی پارس می نمايند.


نحوه ای حرکت اسب در شطرنج
برای پیاده سازی همچین چیزی ابتدا یک کلاس Dog می سازیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و سپس بقیۀ نژاد سگ ها را از کلاس Dog مشتق می کنیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال اگر آدرس هر کدام از سگ ها را به اشاره گری از نوع Dog انتساب دهیم و تابع bark() اون را اجرا کنیم ، تابع مربوط به هر کدام از سگ ها اجرا خواهد شد:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خروجی به صورت زیر خواهد بود(البته کد بالا را تو NodePad نوشتم و کامپایل نکرده ام):
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

4:


5:

کلاس های مجازی در C++

از این کلاس ها وقتی هستفاده می شود که بخواهیم از دو کلاس که از یک کلاس مشترک مشتق شده اند ، کلاسی مشتق کنیم.
مثال:
فرض کنید که کلاس های B1 و B2 از کلاس L مشتق شده اند.

می خواهیم کلاسی به نام D از B1 و B2 مشتق کنیم.

اگر از virtual هستفاده نکنیم، کلاس پایۀ L دو بار به ارث می رسد.

برای جلوگیری از این موضوع باید از کلمۀ کلیدی virtual هستفاده کرد:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که نتیجه به صورت زیر خواهد بود:


البته در موارد نیاز هست که مثلاً دو نمونه از کلاس پایه (کلاس V) در کلاس مشتق شده (کلاس X) باشد.
به مثال زیر دقت کنید:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که نتیجه به صورت زیر خواهد بود:

6:

سلام.
اول یه تشکر خیلی خاص از "hamidreza_buddy" به خاطر جواب عالیشون.
فقط خواستم موردی رو اضافه کنم.

وقتی که از ماکروی extern C هستفاده میکنین این اجازه رو به Module های
ایجاد شده در ++C میدین(مثل DLL ها) که بتونن در سایر زبانها هم هستفاده بشن.دلیش به خاطر تفاوتی هست
که زبان های C و ++C در قراردادنامگذاری symbol ها دارن.

(گرچه واژه syntax به جای ماکرو بهتره)
این رو به این دلیل فرمودم که اگه از DLL تون قراره در برنامه های ++C هستفاده کنین نیازی به هستفاده از این
syntax نیست و تنها همون declspec __ کافیه.
علاوه بر لینکی که hamidreza دادن نگاهی هم به لینک زیر بکنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

7:

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

8:

در مورد هستفاده از dll هم در جواب someoneباید بگم که من از mfc dll برای ساختن object arx مورد هستفاده در اتوکد هستفاده می کنم .اونجوری هم که تو help مربوط به arx دیدم این عبارت به صورت کامل به کار رفته بود

9:


دوباره سلام.
اگه از DLL تون قراره در برنامه های ++C هستفاده کنین نیازی به هستفاده از این syntax نیست.

شاید جمله رو با دقت نخوندین.

ببینید وقتی شما میخواین Dll ی بنویسین که در سایر زبانها ازش هستفاده بشه
مثلا VB باید Dll تون هستاندارد باشه و از توابع هستاندارد C باید هستفاده بشه.

extren C اینکار رو براتون انجام
میده.

فرض کنین با VC یک Dll از نوع Win32 ایجاد میکنین و میخواین دوباره از اون در یک پروژه ی Win32App
هستفاده کنین.

نیازی نیست از extren C هستفاده بشه.

ولی میتونه باشه.

دقیقا مثل DEF فایل برای export
یک تابع از DLL.

وقتی از dllexport هستفاده میشه لازم نیست فایل DEF رو به برنامه اضافه کنین.

ولی میتونین
این فایل رو در DLL داشته باشین.
در مورد ObjectARX به این دلیل میتونین از MFC Dll هستفاده کنین چون از کلاسهای MFC پشتیبانی میکنه.
یک محدویت بزرگ هستفاده از MFC Dll همینه.

تنها در زبان هایی میشه ازش هستفاده کرد که از MFC پشتیبانی
بشه.

شما توضیحی ندادین ولی برای ایجاد یه DLL برای ObjectARX نوعش رو MFC extension DLL انتخاب
میکنین.درسته؟ این به این معنی هست که شما از کلاسهای MFC در برنامه هستفاده میکنین.

که به نظر من
نیازی به هستفاده از decspec__ نیست.

دلیلش هم اینه که براحتی میتونید کلاس مورد نظر رو export کنین.
با هستفاده از ماکروی AFX_EXT_CLASS.

یعنی کافی برای تابع مورد نظرتون یه کلاس بنویسن.
در مورد DLL ها و نوع هایی که میتونین با هستفاده از VC ایجاد کنین بحث خیلی مفصله.
راستی! از کدوم SDK برای توسعه ی برنامتون هستفاده میکنین؟

10:

ممنون از توجه تون .

ببينيد من قراره يك سري امكانات به اتوكد اضافه كنم يه چيزي شبيه plugin و اين كار توسط objectarx sdk انجام مي شه كه از زبان برنامه نايشانسي vs c++.net پشتيباني مي كنه.

اگه مي شه در مورد ماكرايشان AFX_EXT_CLASS.

و نح.ه هستفاده از اون مثالي مطرح كنيد تا متوجه بشم آخه من تا حالا به vs c++.netكار نكردم


50 out of 100 based on 55 user ratings 580 reviews

@