PDA

View Full Version : سوال: اشاره گر از نوع کلاس مشتق



mohsen.nsb44
شنبه 03 دی 1390, 11:36 صبح
با سلام
یک سوالی مطرح شده که خواستم از شما دوستان کمک بگیرم
سوال این است
ایا اشاره گری که از نوع کلاس مشتق است می تواند به شی ای از کلاس پایه اشاره نماید؟
جوابش منفی است اما میشه یه مثال ساده در این رایطه بزنید که این موضوع رو به صورت ساده در اون مثال شرح بدهد.

b.saminjad
شنبه 03 دی 1390, 14:10 عصر
classbase x ////declare var base class

classderive *y ///declare pointer derive class

y=&x //////error

mohsen.nsb44
شنبه 03 دی 1390, 21:47 عصر
دوست عزیز میشه یه مثال کاربردی تری بزنید
من یه مثال تو یه برنامه کوچک میخوام اگه امکانش هست برام بزارین ممنون.

b.saminjad
یک شنبه 04 دی 1390, 12:52 عصر
به مثال زیر دقت کن:




class class1
{
int x ,y;




};

class class2:class1
{


public:

void print()
{

cout<<x<<" "<<y;
}
}

};

void main()
{

class1 x;
class2 *y;

y=&x;---------------------error


y=new class2()-------------true

class2 y1;

y=&y1-------------------------true




}









نمیشه که اشارگر کلاس مشتق به ادرس شی کلاس پایه اشاره کنه

mohsen.nsb44
دوشنبه 05 دی 1390, 11:18 صبح
ممنون از جوابتون
اما یک سوال واسم پیش امده
اگر امکان این وجود داشت که اشارگر کلاس مشتق به ادرس شی کلاس پایه اشاره کنه چه اتفاقی می افتاد چه مشکلاتی به وجود می امد؟

developing
سه شنبه 06 دی 1390, 12:17 عصر
با سلام

این امکانی که شما می گید اگه وجود داشت که... در ادامه بررسی می نماییم.

شی گرایی از روی طبیعت برداشته شده است و برای اون هم دلایل متعددی ذکر شده است.

طبقه بندی زیستی مثال خوبی می تونه باشه.

حیوان یک جاندار است
یک گربه سان حیوان است
یک پلنگ گربه سان است

حال از این طبقه بندی می توانیم بگوییم که پلنگ جاندار هم هست.
اما آیا می توانیم بگوییم هر حیوانی پلنگ است؟ یا حتی گربه سان یعنی پلنگ؟

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

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

در کلاس ها هم همینطور است و اگر این ویژگی وجود داشته باشد طبقه بندی از بین می رود.
امیدوارم خوب توضیح داده باشم.

pe32_64
پنج شنبه 08 دی 1390, 22:15 عصر
عزیزان توجه کنند که اشاره گری که از نوع کلاس مشتق است می تواند به شی ای از کلاس پایه اشاره نماید:
در Visual Studio 2008 نوشتم و کار کرد:


#include <iostream>

using namespace std;
/*
class class1
{
int x ,y;
};

class class2:class1
{
public:
void print()
{
cout<<"";
}
};

void main()
{
class1 x;
class2 *y;
y=(class2*)&x;
y=new class2();
class2 y1;
y=&y1;
}
*/
#include <iostream>

using namespace std;

class a
{
public:
int num;

};
class b: a
{
public:
int num2;

};
void f(a* p)
{
p->num = 55;
}
int main()
{
b *o = new b;
f((a*)o);
//a->num 55 =
}

pe32_64
پنج شنبه 08 دی 1390, 22:26 عصر
به مثال زیر دقت کن:




class class1
{
int x ,y;




};

class class2:class1
{


public:

void print()
{

cout<<x<<" "<<y;
}
}

};

void main()
{

class1 x;
class2 *y;

y=&x;---------------------error


y=new class2()-------------true

class2 y1;

y=&y1-------------------------true




}









نمیشه که اشارگر کلاس مشتق به ادرس شی کلاس پایه اشاره کنه




کدتون اشکال داره!
تصحیح شدش میشه:


#include <iostream>

using namespace std;

class class1
{
int x ,y;
};

class class2:class1
{
public:
void print()
{
cout<<"";
}
};

void main()
{
class1 x;
class2 *y;
y=(class2*)&x;
y=new class2();
class2 y1;
y=&y1;
}

NIMA_1981
جمعه 09 دی 1390, 00:22 صبح
میشه این خط رو توضیح بدید
y=(class2*)&x;

pe32_64
جمعه 09 دی 1390, 12:41 عصر
آقا نیما x از جنس class1 وy از جنس class2 است.
پس اگه بخوایم آدرس x رو که از نوع class1هستش رو در آدرسی از نوعclass2 بریزیم، باید تبدیل(cast)بکنیم :

y=(class2*)&x;

pe32_64
شنبه 10 دی 1390, 20:37 عصر
جناب Negative_Se7en ،من کدتون رو دیدم و همونطوری که میدونستم، گفته های من رو تایید کرد.
تمام فایده ی اینکه اشاره گری که از نوع کلاس مشتق است می تواند به شی ای از کلاس پایه اشاره نماید، این است که از شی جدید،بجای شی قدیمی(منظورم بدون استفاده از امکانات اظافه شده ی جدید )استفاده کنیم.
هر جا شما از توابع کلاس base استفاده می کنی،داری از امکان تبدیل اشاره گری از نوع کلاس مشتق به شی ای از کلاس پایه استفاده می کنی.همچنین تابعAfxBeginThread هم تقریبا همینطوری کار می کنه(اشاره گر به کلاس CWinThread از MFC می گیره که موقع فراخوانی به تابع یک کلاس مشتق شده از CWinThread می دیم).
شما اگه تجربه ی کار با MFC رو داشته باشین،جاهایی رو می بینید که توابعی فقط پارامترهایی می گیرند که کلاسهای (مثلا یک کنترل)BASE هستند.بعد می شود کلاسهای جدید ساخته شده را به توابع فرستاد و تابع براش فرقی نمی کنه که پارامتر از چه کلاسیه (چه کنترلیه)و عملیات مورد نظر رو انجام میده.
مثل کد زیر که برای فوکوس کردن روی کنترل دکمه ازش استفاده می شه:
m_wndButton.SetFocus();

و کاملا هم معتبره!(متدSetFocus از کلاس پایه ای است که متغییر m_wndButton از جنس کلاس مشتق شده ی اونه)

البته باید بدونیم چیکار می خوایم بکنیم(مثل مثال خودتون)
یک نکته:تو ++cشما هر کاری دوست داشته باشی میتونی بکنی،هر کدی رو میشه کامپایل کرد.ولی ++c با نتیجه ی اجرا کاری نداره!(این قانون
cهم هست)

pe32_64
دوشنبه 12 دی 1390, 14:17 عصر
جناب Negative_Se7en جالب اینه کهدر این مثالها ،هیچ کدوم Abstract Classesنیستند.کلاسهای معمولی اند .تو این زبان قسمتهای تعریف نشده ی زیادی وجودداره(من خودم کلی از این موارد دیدم)

pe32_64
دوشنبه 12 دی 1390, 22:50 عصر
منظورتون کدوم کلاس هاست ؟
CWinThread و CWnd که مثال زدم

pe32_64
سه شنبه 13 دی 1390, 14:43 عصر
من تمام حرفم اینه که تا وقتی قابلیتی رو کامپایلر قبول می کنه،دیگه بحث کردن سر وجود داشتن یا نداشتنش بیهوده است .
و فقط باید مراقب که بعد از کامپایل کردن ،چه جوری می خوایم ازش استفاده کنیم.
من خودم از این امکانی که گفتند وجود نداره ،به شکلهایی که می خواستم بارها و بارها استفاده کردم

pe32_64
چهارشنبه 14 دی 1390, 13:37 عصر
ممکنه کسی بعد از خواندن این پسنها گیج بشه ،ولی باید بدونین که من فقط هدفم کمک بود.


بهرحال به نظر من شما از یک طرف درست میگی ولی از یک طرف اشتباه . شاید هم من منظورتون رو اشتباه فهمیدم.جناب Negative_Se7en (http://barnamenevis.org/member.php?134418-Negative_Se7en) ،شما و من تقصیری نداریم.برنامه نویسی اونم با C++‎‎ همینه!ممکنه شما یه کد بتونین بنویسین ولی دیگرس نتونه یا فکر کنه که نمیشه.
در هر صورت ممنون از اینکه وقت گذاشتید.
من در انتها به این نتیجه رسیدم که این قابلیت وجود داره ولی باید موقع استفاده مراقب بود.
موفق باشید