سلام!

در این جلسه می خواهیم با برخی از قابلیت های مربوط به توابع مجازی آشنا شویم. توجّه داشته باشید که قابلیت هایی که در ادامه می خوانید، در c++11 (و بعدتر) وجود دارند.

قابلیت اوّل:

کلاس های موجود در این کد را در نظر بگیرید. فعلا مشکلی در این کد دیده نمی شود؛ اما اگر تابع مجازی موجود در کلاس وارث را تغییر دهید، این تابع دیگر نسخه ی تغییر داده شده ی تابع موجود در کلاس پایه نخواهد بود.

گاهی اوقات ممکن است سهوا این اتفاق بیافتد؛ مثلا ممکن است که شما به تابع مجازی در کلاس پایه یک ورودی اضافه کنید و یادتان برود که همین ورودی را در تابع مجازی کلاس وارث نیز اضافه کنید. برای همین هم برنامه ی شما دیگر درست کار نخواهد کرد.

برای جلوگیری از این مشکل می توانید کلمه ی override را در آخر تابع خود اضافه کنید. یعنی مثل تابع زیر؛

virtual void f( Arguments ) override;

با اضافه کردن این کلمه، کامپایلر متوجه می شود که این تابع قرار است override شده ی یک تابع در کلاس پایه اش باشد؛ بنابراین اگر این تابع با هیچ یک از توابع کلاس پایه همخوانی نداشته باشد، کامپایلر ارور می دهد (مثل این کد).

قابلیت دوم:

شما گاهی اوقات ممکن است که نخواهید یکی از توابع مجازی شما قابل override کردن باشد. در این مواقع می توانید از کلمه ی final استفاده کنید. مثلا تابع مجازی زیر دیگر قابل override کردن نیست؛

virtual void f( Arguments ) final;

این کلمه قابل استفاده برای کلاس ها نیز هست. اگر از این کلمه برای یک کلاس استفاده کنید، دیگر هیچ کلاسی قابلیت ارث بری از این کلاس را نخواهد داشت. به عنوان مثال کلاس زیر غیر قابل ارث بری است؛

class Class_Name final;

قابلیت اوّل خیلی کاربردی است. سعی کنید از آن در کدهای خود استفاده کنید.

موفق باشید!