"چندریختی" یا "چند شکلی" توابع یکی از مفاهیم و قابلیت های پایه در زبان های برنامه نویسی است. C++ نیز این قابلیت را پشتیبانی می کند و به شما امکان میدهد تا توابع همنام ولی با آرگومان های متفاوت ایجاد کنید. این قابلیت در توابع از پیش نوشته شده و توابعی که برنامه نویس ایجاد می کند، بسیار به کار رفته و میرود!
شما میتوانید توابعی توابعی همنام بنویسیود به شرطی که حد اقل یکی از شروط زیر را داشته باشند. (در غیر این صورت کامپایلر از شما خطا می گیرد):

- در تعداد آرگومان ها تفاوت داشته باشند.
- در نوع آرگومان ها تفاوت داشته باشند.

کامپایلر چگونه هنگام فراخوانی می تواند تشخیص دهد که باید از کدام تابع استفاده کند ؟ خب جواب این سوال در تعداد یا نوع آرگومان های ارسالی است. هنگام فراخوانی کامپایلر با توجه به آرگومان های ارسالی میتواند تشخیص دهد که کدام تابع مد نظر شما است. به نسخه های قابل استفاده هر تابع Overloading های تابع نیز گفته می شود. برای مثال تابع WriteLine که از توابع از پیش نوشته ی شده ی دات نت است، دارای بیش از 15 اورلودینگ است.
در زیر نمونه ی ساده از چندریخی یک تابع برای محاسبه ماکسیمم چند عدد را مشاهده می کنید.

int Max (int a, int b)
{
     return (a > b) ? a : b;
}

int Max (int a, int b, int c)
{
     return (a > b) && (a > c) ? a : (b > c) ? b : c;
}

float Max (float a, float b)
{
    return (a > b) ? a : b;
}

سه تابع بالا همنام هستند ولی پارامتر های آنها با یکدیگر یکسان نیست. در تابع اول، 2 پارامتر int ، در تابع دوم، 3 پارامتر int و در تابع سوم، 2 پارامتر float داریم. در هنگام استفاده از تابع Max با توجه به پارامتر هایی که به آن ارسال می کنیم، تابع مناسب انتخاب می شوند.

// first Function
Max (10, 13);

// second Function
Max (10, 12, 15);

// third Function
Max (10.2, 9.5);