یک تابع  به طرق مختلف می تواند در سلسله مراتب کلاس ها و زیر کلاس ها  پیاده سازی شود و شکل های متعددی بگیرد. چندریختی یک رابط مشترک را برای پیاده سازی های مختلف از یک تابع در اختیار می گذارد که برای اشیا تحت شرایط مختلف متفاوت عمل کند. به عبارت دیگر فراخوانی تابعی که متعلق به کلاس است همیشه به شکل زیر خواهد بود.

(object.function(parameter-list

 مثال. در مثال قبل تابع نمایش برای قایق ممکن است متفاوت از نمایش یک وسیله نقلیه باشد. دو تابع می توانند هم نام باشند ولی با کدهای متفاوت بسته به کلاس شیئی که تابع را فراخوانی می کند.

;Vehicle MyVehicle
;Boat YourBoat
;()MyVehicle.Print
;()YourBoat.Print

 در مثال قبل کامپایلر نوع تابع print را برای دو نوع فراخوانی شده بر اساس نوع شیء می تواند پیدا کند. اما گاهی پیدا کردن آن تا زمان اجرای واقعی برنامه ممکن نیست. مشکل زمانی بروز می کند که به شیء از طریق اشاره گر دسترسی می شود و چون اشاره گرها می توانند بطور پویا به انواع مختلفی از اشیا اشاره کنند کلاس شیء تا زمان اجرا مشخص نمی شود. برای حل این موضوع توابع عضو مجازی بکار می روند. توابع مجازی عضو (Virtual member functions) اجازه پیاده سازی خاص تری از تابعی که فراخوانی می شود را مطابق با نوع شیء زمان اجرا می دهند.