PDA

View Full Version : سرعت اجرا و توابع Virtual



behnia_k
یک شنبه 29 بهمن 1391, 08:44 صبح
با سلام
به نظر شما اگر در يك فانكشن كلاسي بكمك شرط نحوه اجرا را مشخص كنيم از نظر سرعت اجرا بهتر است يا اينكه يك فانكشن virtual داشته باشيم با توجه با اينكه توسط كي به ارث ميرسد فانكشن خاصر را كال كند.


class cA
{
int const mod;
public:
cA(int m) : mod(m) {};
void F1()
{
if (mod)
{
//...
}
else
{
//...
}
//
//...
};
void E1()
{
E2();
//...
}
virtual void E2() { E2B(); }
virtual void E2B();
virtual void E2C();
};

class cB : public cA
{
public:
cB(int mod) : cA(mod) {};
void E2() { E2B(); };
};

class cC : public cA
{
public:
cC(int mod) : cA(mod) {};
void E2() { E2C(); };
};


من ميخواهم با توجه به اينكه مقدار ثابت mod چيست فانكشن مشخصي يا كار مشخصي انجام شود و در خود كلاس cA چگونگي انجام اين كار معلوم است (لذا شايد استفاده از توابع ويرچوال لزومي نداشته باشد). نظر شما در باره استفاده از فانكشن پوينتر چيست؟

sorosh_sabz
جمعه 04 اسفند 1391, 00:33 صبح
به نام خدا

کلا بنظرم اگر فقط قرار است در این کلاس ها این کارها انجام شود اصلا نیازی به کلاس ندارید و بیجهت سربار کلاس را تحمل می‌کنید. دیگر سربار virtual که بکنار.

اگر کارهایی که در هر حالت می خواهید انجام دهید به اندازه‌ی خوبی از هم جدا هستند توصیه می‌کنم کلا دو تابع برای کارتان بنویسید و هر وقت از هرکدام احتیاج داشتید استفاده کنید.

اگر نه ( یعنی کارهایتان به هم نزدیکی معنایی قابل قبولی دارند ) می‌توانید از template inline function استفاده کنید البته اگر تعداد باری که می‌خواهید توابعتان را صدا کنید زیاد است مانند کد زیر :


//ITNOA
#include <iostream>

using namespace std;

template <bool T>
inline void f()
{
if (T == true)
cout << "salam" << endl;
else
cout << "khodahafez" << endl;
}

int main()
{
f<true>();
}



این کد را در کلاس هم می شود استفاده کرد. کلا من اگر واقعا یکسری موجود ( Object ) نداشته باشم که حالا در عین اینکه از پدرشون یکسری کار رو به ارث می برن ولی باید به سبک خودشون انجام بدن سراغ Polymorphism و virutal function سعی می‌کنم نرم.

DigitalRain
شنبه 05 اسفند 1391, 21:50 عصر
آقا تو این کد اگه بجای template آرگومان رو پاس می‌دادیم چه تفاوتی می‌کرد؟

sorosh_sabz
جمعه 11 اسفند 1391, 21:32 عصر
به نام خدا

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

DigitalRain
دوشنبه 13 خرداد 1392, 23:17 عصر
واو! خیلی جالبه!