PDA

نسخه کامل مشاهده نسخه کامل : کاربرد virtual در ++c



sara_she
26-03-2007, 12:08
با سلام
می خواستم بدونم وقتی تو ++c کلاس مشتق شده ای از کلاس اصلی را ازنوع virtual تعریف کنیم این چه معنی داره؟
اگه توضیح کلی در مورد استفاده از virtualدر تعریف توابع و کلاس ها بدین ممنون می شم.

sara_she
26-03-2007, 12:10
باسلام اگه می شه بگین دقیقا( extern "C" __declspec(dllexport به چه منظوری به کار می ره؟

hamidreza_buddy
26-03-2007, 12:37
باسلام اگه می شه بگین دقیقا( extern "C" __declspec(dllexport به چه منظوری به کار می ره؟

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

فایل سرآمد dlltest.h

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فایل سورس dlltest.cpp

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگر این دو فایل را در MS VC++ به یک پروژه از نوع Win32 Dynamic-Link Library اضافه کنی بعد از کامپایل dll به شما داده می شود.

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

hamidreza_buddy
26-03-2007, 13:11
توابع مجازی در C++:
زمانی یک تابع را به صورت مجازی تعریف می کنیم که نیاز باشد که برای هر کلاس مشتق شده کد متفاوتی اجرا شود. معمولاً برای چندریختی (Polymorphism) کاربرد دارد.
مثال: چند نژاد از سگ ها را در نظر بگیرید. همۀ آن ها نوعی سگند. همۀ آن ها نیز به شکل خاصی پارس می کنند. برای پیاده سازی همچین چیزی ابتدا یک کلاس Dog می سازیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و سپس بقیۀ نژاد سگ ها را از کلاس Dog مشتق می کنیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حال اگر آدرس هر کدام از سگ ها را به اشاره گری از نوع Dog انتساب دهیم و تابع bark() آن را اجرا کنیم ، تابع مربوط به هر کدام از سگ ها اجرا خواهد شد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خروجی به صورت زیر خواهد بود(البته کد بالا را تو NodePad نوشتم و کامپایل نکرده ام):

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

hamidreza_buddy
26-03-2007, 13:25
کلاس های مجازی در C++

از این کلاس ها زمانی استفاده می شود که بخواهیم از دو کلاس که از یک کلاس مشترک مشتق شده اند ، کلاسی مشتق کنیم.
مثال:
فرض کنید که کلاس های B1 و B2 از کلاس L مشتق شده اند. می خواهیم کلاسی به نام D از B1 و B2 مشتق کنیم. اگر از virtual استفاده نکنیم، کلاس پایۀ L دو بار به ارث می رسد. برای جلوگیری از این موضوع باید از کلمۀ کلیدی virtual استفاده کرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که نتیجه به صورت زیر خواهد بود:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

البته در موارد نیاز است که مثلاً دو نمونه از کلاس پایه (کلاس V) در کلاس مشتق شده (کلاس X) باشد.
به مثال زیر دقت کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که نتیجه به صورت زیر خواهد بود:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

someone
27-03-2007, 05:00
سلام.
اول یه تشکر خیلی خاص از "hamidreza_buddy" به خاطر پاسخ عالیشون.
فقط خواستم موردی رو اضافه کنم. وقتی که از ماکروی extern C استفاده میکنین این اجازه رو به Module های
ایجاد شده در ++C میدین(مثل DLL ها) که بتونن در سایر زبانها هم استفاده بشن.دلیش به خاطر تفاوتی هست
که زبان های C و ++C در قراردادنامگذاری symbol ها دارن. (گرچه واژه syntax به جای ماکرو بهتره)
این رو به این دلیل گفتم که اگه از DLL تون قراره در برنامه های ++C استفاده کنین نیازی به استفاده از این
syntax نیست و تنها همون declspec __ کافیه.
علاوه بر لینکی که hamidreza دادن نگاهی هم به لینک زیر بکنید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] spec.28.dllexport.29.asp

sara_she
31-03-2007, 11:50
خیلی ممنون از راهنمایی دقیق و کاملتون
فکر نمی کنم اگه چند کتاب با هم می خوندم بازم نمی تونستم تمام این نکات کلیدی رو جمع آوری کنم
خسته نباشید

sara_she
31-03-2007, 12:27
در مورد استفاده از dll هم در جواب someoneباید بگم که من از mfc dll برای ساختن object arx مورد استفاده در اتوکد استفاده می کنم .اونجوری هم که تو help مربوط به arx دیدم این عبارت به صورت کامل به کار رفته بود

someone
31-03-2007, 15:55
در مورد استفاده از dll هم در جوابsomeone باید بگم که من از mfc dll برای ساختن object arx مورد استفاده در اتوکد استفاده می کنم .اونجوری هم که تو help مربوط به arx دیدم این عبارت به صورت کامل به کار رفته بود.



دوباره سلام.

اگه از 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 برای توسعه ی برنامتون استفاده میکنین؟

sara_she
03-05-2007, 10:51
ممنون از توجه تون . ببينيد من قراره يك سري امكانات به اتوكد اضافه كنم يه چيزي شبيه plugin و اين كار توسط objectarx sdk انجام مي شه كه از زبان برنامه نويسي vs c++.net پشتيباني مي كنه. اگه مي شه در مورد ماكروي AFX_EXT_CLASS. و نح.ه استفاده از اون مثالي مطرح كنيد تا متوجه بشم آخه من تا حالا به vs c++.netكار نكردم