توابع overloaded با ارث بری در زبان cpp

آیا overloading در مفاهیم ارث بری در زبان برنامه نویسی سی پلاس پلاس کار میکند یاخیر؟

overload کردن در سی پلاس پلاس یعنی اینکه شما از یک فانکشن با اسم(signature) یکسان در scope یکسان چند نمونه داشته باشید.

در کد زیر، یک تابع به نام print داریم که با آرگومان های مختلف نوشته شده است، این سه تابع را توابع overload شده می نامند چون نام یکسانی دارند و بازگشتی آنها یکسان می باشد ولی آرگومان های آنها یکسان نمی باشد و در زبان سی پلاس پلاس نمی تواند یکسان هم از نظر تعداد و هم از نظر نوع متغیر آرگومان باشد.

نکته: توابع در زبان C همانند سی پلاس پلاس نمی توانند overload  بشوند چون در زمان ساخت فایل اسمبلی در مراحل کامپایل برنامه اسم تابع در زبان C به همان صورت در فایل اسمبلی موجود خواهد بود ولی در زبان سی پلاس پلاس درکنار اسم تابع یک سری کاراکتر های تولیدی دیگری وجود خواهد داشت و به همین علت می توان توابع راoverload کرد.

نکته: قسمت بازگشتی تابع، جز signature یا ساختار تابع برای overloading به حساب نمی آید.نمونه ساده از overloading در زیر آمده است.

#include <iostream>
using namespace std;
 
void print(int i) {
  cout << " Here is int " << i << endl;
}
void print(double  f) {
  cout << " Here is float " << f << endl;
}
void print(char const *c) {
  cout << " Here is char* " << c << endl;
}
 
int main() {
  print(10);
  print(10.10);
  print("ten");
  return 0;
}

بعد از توضیح مختصر در مورد توابع overload شده به نکته ای اشاره خواهیم کرد که آیا توابع overload شده در مفاهیم ارث بری صورت خواهد گرفت یا خیر؟

به کد زیر توجه کنید، در سی پلاس پلاس توابع overload شده را می توان در کلاس parent و child ایجاد کرد ولی در استفاده از آنها با مفاهیم ارث بری نکته ای وجود دارد که اگر از کلاس child شی ای ایجاد شود این شی به تابع overload شده در کلاس پرنت دسترسی نخواهد داشت درحالی که کلاس child تمامی توابع عمومی کلاس parent را بر اساس مفاهیم شی گرایی به ارث می برد.

در سی پلاس پلاس توابع overloadشده در کلاس مشتق شده دسترسی نخواهند داشت. در تکه کد بالا،کامپایلر سی پلاس پلاس ناحیه مشتق شده را بررسی میکند اگر تابع مورد نظر وجود داشت استفاده میکند در غیراین صورت خطا می دهد.

#include <iostream>
using namespace std;
class Base
{
public:
    int f(int i)
    {
        cout << "f(int): ";
        return i+3;
    }
};
class Derived : public Base
{
public:
    double f(double d)
    {
        cout << "f(double): ";
        return d+3.3;
    }
};
int main()
{
    Derived* dp = new Derived;
    cout << dp->f(3) << '\n';
    cout << dp->f(3.3) << '\n';
    delete dp;
    return 0;
}

نکته مهم: در سی پلاس پلاس هیچ overloading ای بین نواحی مختلف یا اصلاحا across scopes نداریم. ناحیه مشتق شده هم استثنا نیست. جهت مطالعه بیشتر به این منبع و مرجع مراجعه نمائید.

نکته مازاد: در زبان برنامه نویسی جاوا overloading ای بین نواحی مختلف یا اصلاحا across scopes داریم

تا به اینجا نتیجه گرفتیم که نمی توانیم از تابع overload شده در سمت child استفاده کرد ولی کلید واژه using می تواند این اتفاق را برآورده کند.

;using Parent::fun

به کد زیر توجه فرمائید. در تکه کد زیر تابع fun در سمت parent و child پیاده سازی شده است یا اصطلاحا overload شده است که بر اساس توضیحات بالا شی ای از child نمی تواند به تابع هم نام خودش در parent دسترسی داشته باشد ولی با کلید واژه using این اتفاق غیرممکن، ممکن می شود.

#include <iostream>
using namespace std;
  
class Base {
public:
    int fun() { cout << "Base::fun() called"; }
};
  
class Derived : public Base {
public:
    using Base::fun;
  
    int fun(char c) // Makes Base::fun() and Base::fun(int )
                    // unhidden
    {
        cout << "Derived::fun(char c) called";
    }
};
  
// Driver Code
int main()
{
    Derived d;
    d.fun(); // Works fine now
    return 0;
}
5 1 رای
رأی شما
اشتراک در
اطلاع از
guest
0 تا پیام
بازخورد (Feedback) های اینلاین
View all comments
فهرست
0
افکار شما را دوست دارم، لطفا دیدگاه خود را ارسال نمائید.x