View Full Version : Constructor در derived کلاس
ICEMAN
دوشنبه 24 دی 1386, 09:07 صبح
سلام ... وقتی از یه کلاسی ارث میبریم برای Constructor کلاس base چه پیش میاد ؟
اگه از چند کلاس ارث ببریم چطور ؟
emad_67
دوشنبه 24 دی 1386, 13:00 عصر
وقتی از یه کلاس مشتق شده شی ایی رو بسازی ابتدا سازنده کلاس پایه فراخوانی میشه و بعد سازنده کلاس مشتق شده. این قانون برای چند کلاسی که از هم مشتق میشن هم صادقه.
ICEMAN
سه شنبه 25 دی 1386, 08:31 صبح
#include <iostream>
using namespace std;
class test1
{
public :
test1()
{
cout <<"test1{} ctor" <<endl;
}
~test1()
{
cout <<"test1{} dtor" <<endl;
}
void pubPrint1()
{
cout <<" test1{} --> pubPrint1()" <<endl;
}
protected :
void protecPrint1()
{
cout <<" test1{} --> protecPrint1()" <<endl;
}
private :
void privPrint1()
{
cout <<" test1{} --> privPrint1()" <<endl;
}
};
class test2 :public test1
{
public :
test2()
{
cout <<"test2{} ctor" <<endl;
}
~test2()
{
cout <<"test2{} dtor" <<endl;
}
void pubPrint2()
{
cout <<" test2{} ->>pubPrint2()" <<endl;
test1 ::protecPrint1();
}
};
class test3 :public test2
{
public :
test3()
{
cout <<"test3{} ctor" <<endl;
}
~test3()
{
cout <<"test3{} dtor" <<endl;
}
pubPrint3()
{
cout <<" test3{} pubPrint() " <<endl;
test2 ::protecPrint1();
}
};
int main()
{
test1 t1;
t1.pubPrint1();
OUTPUT :
test1{} ctor
test1{} --> pubPrint1()
test1{} dtor
test2 t2;
t2.pubPrint1();
t2.pubPrint2();
OUTPUT
test1{} ctor
test2{} ctor
test1{} --> pubPrint1()
test2{} ->>pubPrint2()
test1{} --> protecPrint1()
test2{} dtor
test1{} dtor
test3 t3;
t3.pubPrint3();
test1{} ctor
test2{} ctor
test3{} ctor
test3{} pubPrint()
test1{} --> protecPrint1()
test3{} dtor
test2{} dtor
test1{} dtor
return 0;
}
emad_67
سه شنبه 25 دی 1386, 08:55 صبح
توی این مثال هم ترتیب فراخوانی ها درسته. همونطور که در پست قبل گفتم در کلاس های مشتق شده ابتدا باید سازنده کلاس پایه فراخوانی بشه و بعد سازنده کلاس مشتق شده. حالا توی مثالت 3 تا کلاس داریم که به ترتیب از هم مشتق شدن. اگر شی از کلاس test2 بسازیم، برای این که این شی ساخته بشه باید ابتدا سازنده کلاس test1 که کلاس پایه اون هست فراخوانی بشه و بعد سازنده test2. در صورتی که شی ایی از test3 بسازیم مثل قبل ابتدا باید سازنده کلاس پایه اون یعنی test2 فراخوانی بشه، در اینجا خود کلاس test2 یک کلاس مشتق شده هست که برای خود این کلاس هم ابتدا باید سازنده کلاس پایه اون یعنی test1 و بعد سازنده خودش یعنی test2 فراخوانی بشه. پس ترتیب فراخوانی سازنده ها برای شی کلاس test3 به همین شکلی که در مثال گذاشتی میشه. ترتیب فراخوانی destructor ها دقیقا عکس constructor ها هست به طور مثال برای شی ایی از کلاس test3 ابتدا باید اجزای خود کلاس test3 از بین برن، بعد اجزای test2 و بعد test1.
ICEMAN
سه شنبه 25 دی 1386, 10:16 صبح
*** اگه توی یه Scope جدا هم Object ی رو تعریف کنیم بعد از خروج از اون Scope به ترتیب مثال بالا
Constructor ها و destructor ها call می شن
emad_67
سه شنبه 25 دی 1386, 12:27 عصر
*** اگه توی یه Scope جدا هم Object ی رو تعریف کنیم بعد از خروج از اون Scope به ترتیب مثال بالا
Constructor ها و destructor ها call می شناین سوال بود؟
اگه سوال بود که:
بله همین طور هست در واقع constructor هر موقعی که شی ساخته میشه فراخوانی میشه و destructor هم موقعی که حوزه فعالیت اون شی تموم میشه فراخوانی میشه. مثلا اگه یه شی رو به صورت static تعریف کنی تا وقتی که تابع main به پایان نرسه در برنامه باقی میمونه.
ICEMAN
سه شنبه 25 دی 1386, 14:38 عصر
نه همین طوری نوشتم گفتم شاید بدرد کسی خورد
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.