سربارگذاری متدهای عمومی

همانطور که یک متد معمولی را می توانیم سربارگذاری کنیم، متدهای عمومی را نیز می توانیم سربارگذاری کنیم. در سربارگذاری های مختلف یک تابع، نام آن تغییر نمی کند، ولی نوع یا تعداد پارامتر های سربارگذاری های مختلف با یکدیگر متفاوت است. مثال زیر که یک تابع قالب را سربارگذاری می کند را در نظر بگیرید :

  1: #include <iostream>
  2: using namespace std;
  3: 
  4: template<class Type>
  5: void ShowMessage(Type T)
  6: {
  7:     cout << "Double version of the method was called." << endl;
  8: }
  9: 
 10: void ShowMessage(int number)
 11: {
 12:     cout << "Integer version of the method was called." << endl;
 13: }
 14: 
 15: int main()
 16: {
 17:     ShowMessage(9);
 18:     ShowMessage(9.99);
 19: }
Integer version of the method was called.
Double version of the method was called.

زمانی که کامپایلر با یک تابع سربارگذاری شده رو به رو می شود، ابتدا بررسی می کند که آیا یک متد عادی برای اینکار وجود دارد یا خیر؟ اگر وجود داشت آن را فراخوانی می کند، در غیر اینصورت بررسی می کند که آیا متد عمومی وجود دارد یا خیر؟ اگر وجود داشت آن را فرخوانی می کند و اگر هیچ متدی وجود نداشت، باعث بروز خطا می شود. در مثال بالا می توانید مشاهده کنید که، اگر یک مقدار از نوع صحیح را به متد ارسال کنیم (خط 17) در نتیجه چون یکی از سربارگذاری های این متد یک عدد از نوع صحیح دریافت می کند (خط 10)، در نتیجه کدهای بدنه این متد اجرا می شوند (خط 12). در فراخوانی دوم (خط 18) چون یک مقدار از نوع double به متد ارسال کرده ایم در نتیجه کدهای بدنه نسخه عمومی متد یعنی خط 7 اجرا می شود.