PDA

View Full Version : کلاس



suraty
چهارشنبه 18 آبان 1390, 19:24 عصر
سلام
چند تا سوال از برنامه ی زیر داشتم:
1- چرا تو خط 5 و 9 و 13 قبل نوشتن تابع از کلمه virtual استفاده کرده؟
2- چرا تو خط 7 و 11 کلاس رو اینجوری تعریف کرده:

class c:public b{
class d:public b{



#include"iostream.h"
#include"conio.h"
class b{
public:
virtual void f(){ cout<<"b"; }
};
class c:public b{
public:
virtual void f(){ cout<<"c"; }
};
class d:public b{
public:
virtual void f(){ cout<<"d"; }
};
int main(){
b *p,b;
c c1;
d d1;
p=&d1;
p->f();
p=&c1;
p->f();
return 0;
}

_hamid
چهارشنبه 18 آبان 1390, 19:52 عصر
ارث بری
یا
inheritance رو مطالعه کن :)

shahmohammadi
چهارشنبه 18 آبان 1390, 19:53 عصر
سلام.
تو خط هفت کلاس c رو طوری تعریف میکنه که از b ارث ببره.نحوه ی ازث بری هم به همون صورته.
در ضمن وقتی تابعی رو در یک کلاس پدر virtual تعریف کنیم یعنی می خواهیم در کلاس های فرزند دوباره از نو تعریفشون کنیم. حالا ممکنه که این پدر چند تا فرزند داشته باشه، در این صورت این تابع در همشون هست ولی دستورات متفاوتی رو اجرا می کنند.

موفق باشید.

developing
پنج شنبه 19 آبان 1390, 10:51 صبح
با سلام

كلاسها براي اينكه بتونن از ويژگيهاي ديگران استفاده كنن مي تونن از اونها ارث بري داشته باشند(به كلاسي كه ارث بري مي كنه مي گن كلاس فرزند يا مشتق شده و به كلاسي كه اين فرزند ازش مشتق شده مي گن والد يا پدر). در اين صورت فرزند ويژگيها و توابع كلاس والد رو در خودش داره.
ارث بري به اشكال گوناگون امكان پذير هست:
1- ارث بري عمومي: در اين نوع ارث بري توابع و متغيرهاي عمومي كلاس والد با خاصيت عمومي، توابع و متغيرهاي محافظت شده كلاس والد با خاصيت محافظت شده در كلاس فرزند در دسترس خواهند بود. توابع و متغيرهاي اختصاصي هم كه در ارث بري شركت داده نمي شوند.مثل:

class c:public b{

كه كلاس c به صورت عمومي از كلاس b ارث بري دارد.

2- ارث بري محافظت شده: در اين روش توابع و متغيرهاي عمومي و محافظت شده ي كلاس والد با خاصيت محافظت شده در كلاس فرزند حضور دارند.مثل:

class c:protected b{

كه كلاس c به صورت محافظت شده از كلاس b ارث بري دارد.

3- ارث بري اختصاصي: در اين روش هم توابع و متغيرهاي عمومي و محافظت شده ي كلاس والد با خاصيت اختصاصي در كلاس فرزند معرفي مي شوند.مثل:

class c:private b{

كه كلاس c به صورت اختصاصي از كلاس b ارث بري دارد.

حال مي رسيم به بحث توابع مجازي(virtual): همونطور كه دوستان اشاره كردند با استفاده از اين كلمه كليدي مي تونيم يه تابع مجازي بسازيم اين تابع در واقع الگوي پياده سازي تابع هاي مشابه در كلاس فرزند رو مشخص مي كنه و در واقع وجود نداره و براي اينكه به اين تابع دسترسي داشته باشيم بايد هر كلاس فرزند پياده سازي خاص خودش رو از اين تابع انجام بده.
به عبارت ديگر با نوشتن تابع مجازي به كلاسهاي فرزند اجبار مي كنيم كه حتما چنين تابعي رو درون خودشون ايجاد كنند.