PDA

View Full Version : نمونه سازی از کلاس فرزند در حافظه stack، وقتی که کلاس والد abstract باشه؟



PC2st
شنبه 04 اسفند 1386, 22:25 عصر
اگه یک کلاس abstract باشه و کلاس دیگه ای رو ازش مشتق کنیم، در اینصورت چطور میشه یک نمونه از کلاس مشتق شده رو در حافظه stack نمونه سازی کرد؟
مثلا اگه این کلاس abstract باشه:


class Abstract
{
public :
virtual void DoIt() = 0;
};


و اگه این کلاس مشتق شده باشه:


class Derived : public Abstract
{
public :
virtual void DoIt();
};

void Derived::DoIt()
{
std::cout << "Hell!" << std::endl;
}


در اینصورت برای اینکه یک نمونه از کلاس Derived رو در حافظه stack نمونه سازی کنیم و درون شیئی از کلاس abstract قرار بدیم، چه کار باید کرد؟ کد زیر جواب نداد:


Derived o;
Abstract a( o );


و تنها در heap میشه نمونه سازی کرد:


Abstract *a = new Derived();


آیا راهی وجود نداره؟

ICEMAN
یک شنبه 05 اسفند 1386, 08:49 صبح
سلام ...
قبل هر چیز
http://www.cplusplus.com/doc/tutorial/polymorphism.html اینجا یه سری بزن !
خب معلومه کار نمیکنه.
شما باید یه Pointer از کلاس Abstract به derived کلاس یا کلاس هایی که از derived به ارث میبرن بدی .
مثلا :


Abstract *abstPtr= &o;

و بعد


abstPtr->DoIt();

شما خودت جایی Dynamic اون Object رو ساختی همین کار و کردی ( یه pointer از کلاس Abstract به Object از کلاس derived )


Abstract *a = new Derived();
در ضمن :



Derived o;
Abstract a( o );

اگر قرار بود با این شیوه بشه polyMorphism کار کرد باز هم برنامه ت خطا داشت
شما توی constructor هیچparameter ی نمی گیرید .چطور o رو به a به عنوان parameter میدین !!!!

PC2st
یک شنبه 05 اسفند 1386, 16:48 عصر
شما خودت جایی Dynamic اون Object رو ساختی همین کار و کردی ( یه pointer از کلاس Abstract به Object از کلاس derived )
نمیدونم چرا اون لحظه فکر کردم حتما باید حافظه اش رو بطور dynamic (در heap) بسازم و به ذهنم نرسیده بود که میشه آدرسش رو از پشته به شیئ والد معرفی کرد !!! :متفکر: :-/ :-)


شما توی constructor هیچparameter ی نمی گیرید .چطور o رو به a به عنوان parameter میدین !!!!
هر کلاس دو تا متد سازنده ی پیش فرض داره، یکی بدون پارامتر و دیگری یک پارامتر از نوع خود کلاس دریافت میکنه.


Abstract();
Abstract(const Abstract &);

میخواستم کلاس o رو به متد سازنده دوم (که یک پارامتر میگیره) بفرستم تا شاید کلاس abstract نمونه سازی نشه و از نمونه ی کلاس فرزند استفاده کنه، اما همانطور که گفتید، ذاتا نمیشه کلاسهای abstract رو بصورت value type بکار برد چون در اینصورت حتما نمونه سازی میشه.


از راهنماییتون بسیار ممنون...