সি ++ এ ভার্চুয়াল ফাংশন কীভাবে প্রয়োগ করা যায়?



এই নিবন্ধটি আপনাকে আরও একটি প্রোগ্রামিং ধারণার সাথে পরিচয় করিয়ে দিবে যা হ'ল সি ++ এর ভার্চুয়াল ফাংশন। ধারণাটি প্রদর্শন দ্বারা সমর্থিত হবে।

মধ্যে একটি ভার্চুয়াল ফাংশন সি ++ বেস ক্লাসের মধ্যে একটি সদস্য ফাংশন যা আমরা একটি উত্পন্ন শ্রেণিতে পুনরায় সংজ্ঞায়িত করি। এই নিবন্ধটি আপনাকে ধারণাটি বিশদভাবে আবিষ্কার করতে সহায়তা করবে। নিম্নলিখিত পয়েন্টারগুলি এই নিবন্ধে কভার করা হবে,

সুতরাং আসুন আমরা এই নিবন্ধটি দিয়ে C ++ এ ভার্চুয়াল ফাংশন নিয়ে শুরু করি





ভার্চুয়াল ফাংশন কী?

ভার্চুয়াল ফাংশন হ'ল বেস ক্লাসের মধ্যে একটি সদস্য ফাংশন যা আমরা একটি উত্পন্ন শ্রেণিতে পুনরায় সংজ্ঞায়িত করি। এটি ভার্চুয়াল কীওয়ার্ড ব্যবহার করে ঘোষণা করা হয়। ভার্চুয়াল ফাংশনযুক্ত কোনও শ্রেণি উত্তরাধিকার সূত্রে প্রাপ্ত হলে, উদ্ভূত শ্রেণি তার নিজস্ব প্রয়োজন অনুসারে ভার্চুয়াল ফাংশনটিকে নতুনভাবে সংজ্ঞায়িত করে।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে



সি ++ তে ভার্চুয়াল ফাংশনের নিয়ম:

  • এগুলি সর্বদা একটি বেস শ্রেণিতে সংজ্ঞায়িত করা হয় এবং উত্পন্ন শ্রেণিতে ওভাররাইড করা হয় তবে উত্পন্ন শ্রেণিতে ওভাররাইড করা বাধ্যতামূলক নয়।
  • ভার্চুয়াল ফাংশনগুলি ক্লাসের সর্বজনীন বিভাগে ঘোষণা করতে হবে।
  • এগুলি স্থির বা বন্ধু ফাংশন হতে পারে না অন্য শ্রেণীর ভার্চুয়াল ফাংশনও হতে পারে।
  • রান টাইম পলিমারফিজম অর্জনের জন্য পয়েন্টার ব্যবহার করে ভার্চুয়াল ফাংশনগুলি অ্যাক্সেস করা উচিত।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে।

ওভারলোডিং এবং ওভাররাইডের মধ্যে পার্থক্য

বাঁধাই কি?

ফাংশনগুলির জন্য বাইন্ডিং এর অর্থ হ'ল যেখানেই কোনও ফাংশন কল রয়েছে, কম্পাইলারের সাথে এটি জানা উচিত যে কোন ফাংশন সংজ্ঞাটির সাথে এটি মিলানো উচিত। এটি প্রতিটি ফাংশন ঘোষণার স্বাক্ষর এবং গৃহীত কার্যাদিগুলির উপর নির্ভর করে। এছাড়াও, সংকলকটি জানতে হবে যে ফাংশন কল এবং সঠিক সংজ্ঞা নির্বাচনের মধ্যে এই মিল কখন ঘটবে।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে



আর্লি বাইন্ডিং

প্রারম্ভিক বাঁধাই একটি ঘটনা যেখানে বিভিন্ন ফাংশন কলগুলির সাথে মেলে যাওয়ার সিদ্ধান্তটি সংকলনের সময় ঘটে এবং সংকলক সরাসরি লিঙ্কগুলিকে ঠিকানার সাথে যুক্ত করে। এটি স্ট্যাটিক বাইন্ডিং বা কমাইল টাইম বাইন্ডিং হিসাবেও পরিচিত।

  • যেমনটি আমরা জানি আমরা উচ্চ স্তরের ভাষায় কোড লিখি
  • তারপরে সংকলকটি নিম্ন-স্তরের ভাষায় রূপান্তর করে যা কম্পিউটার বুঝতে পারে, বেশিরভাগ সংকলনের সময় মেশিনের ভাষা
  • প্রারম্ভিক বাঁধাইয়ের মধ্যে, সংকলকটি সরাসরি ফাংশন কল নির্দেশের জন্য ফাংশন ঘোষণা নির্দেশের ঠিকানা সরবরাহ করে
  • নামটি যেমনটি নির্দেশ করে তেমনই প্রোগ্রামটি চালুর আগে খুব তাড়াতাড়ি এই বাইন্ডিংটি ঘটে।

উদাহরণ

# নেমস্পেসের স্ট্যান্ড ক্লাস অ্যানিমালগুলি ব্যবহার করে অন্তর্ভুক্ত করুন {সর্বজনীন: শূন্য শব্দ () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <শব্দ () // প্রারম্ভিক বাঁধাই রিটার্ন 0}

আউটপুট

আউটপুট- সি ++ এ ভার্চুয়াল ফাংশন - এডুরেকা

স্পষ্টতা আয়ন
এই উদাহরণে, আমরা প্যারেন্ট ক্লাস অ্যানিমালগুলিতে একটি পয়েন্টার তৈরি করেছি। তারপরে a = & c লিখে পয়েন্টারটি ‘এ’ শ্রেণীর বিড়ালদের অবজেক্ট সি উল্লেখ করা শুরু করে।
a -> শব্দ () - পয়েন্টার দ্বারা 'ক' দ্বারা উভয় শ্রেণিতে উপস্থিত ফাংশন () শব্দটি কল করার সময়, 'প' শ্রেণীর ক্রিয়াকলাপ কল হয়, এমনকি যদি পয়েন্টারটি বিড়ালের শ্রেণীর অবজেক্টের উল্লেখ করে তবে ।

এটি আর্লি বাইন্ডিংয়ের কারণে। আমরা জানি যে ‘এ’ শিশু শ্রেণীর অবজেক্টকে উল্লেখ করে পিতামাত্ত শ্রেণীর নির্দেশক। যেহেতু প্রারম্ভিক বাঁধাই সংকলন সময়ে ঘটে থাকে, তাই সংকলক যখন দেখল যে 'ক' পিতামাত্ত শ্রেণীর একটি পয়েন্টার, এটি পয়েন্টারটি অবজেক্ট না করে পিতামাত্ত শ্রেণীর 'সাউন্ড ()' ফাংশনের সাথে কলটির সাথে মেলে it উল্লেখ করা হচ্ছে।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে

দেরীতে বাঁধাই

দেরীতে বাইন্ডিংয়ের মধ্যে, সংকলকটি রানটাইমে অবজেক্টটি সনাক্ত করে এবং তারপরে সঠিক ফাংশনের সাথে ফাংশন কলটির সাথে মেলে। এটি ডায়নামিক বাইন্ডিং বা রানটাইম বাঁধাই হিসাবেও পরিচিত।

উপরের সমস্যাটির দেরীতে বাইন্ডিংটি বেস শ্রেণিতে ভার্চুয়াল কীওয়ার্ড ব্যবহার করে সমাধান করা যেতে পারে। উপরের উদাহরণটি নিজে ব্যবহার করে কীভাবে এটি ঘটে তা দেখা যাক, তবে কেবল ভার্চুয়াল কীওয়ার্ড যুক্ত করে।

উদাহরণ

# নেমস্পেস স্ট্যান্ড ক্লাস অ্যানিমালস ব্যবহার করে অন্তর্ভুক্ত করুন {সর্বজনীন: ভার্চুয়াল শূন্য শব্দ () out cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <শব্দ () ফিরে 0 return

আউটপুট

ব্যাখ্যা
এখানে বেস শ্রেণীর ফাংশন শব্দ () ভার্চুয়াল করা হয়, সুতরাং সংকলক এখন এই ফাংশনটির জন্য দেরীতে বাইন্ডিং সম্পাদন করে। এখন, সাউন্ডের ফাংশন কল () ফাংশনটি রানটাইমের সময় ফাংশন সংজ্ঞায় মেলে। সংকলক যেহেতু এখন পয়েন্টারকে 'a' সনাক্ত করেছে শ্রেণীর বিড়ালগুলির বস্তু 'গ' হিসাবে উল্লেখ করেছে, এটি শ্রেণীর বিড়ালগুলির শব্দ () ফাংশনটিকে কল করবে।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে

খাঁটি ভার্চুয়াল ফাংশন

সি ++ তে একটি খাঁটি ভার্চুয়াল ফাংশন একটি ভার্চুয়াল ফাংশন যার জন্য আমাদের কোনও প্রয়োগ নেই, আমরা কেবল এটি ঘোষণা করি। ঘোষণায় 0 নির্ধারিত করে একটি খাঁটি ভার্চুয়াল ফাংশন ঘোষণা করা হয়।

ভার্চুয়াল শূন্য শব্দ () = 0

এখানে শব্দ () একটি খাঁটি ভার্চুয়াল ফাংশন।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে

বিমূর্ত শ্রেণি

একটি বিমূর্ত শ্রেণিকে এক বা একাধিক খাঁটি ভার্চুয়াল ফাংশন সহ একটি শ্রেণি হিসাবে সংজ্ঞায়িত করা হয়। উপরে বর্ণিত হিসাবে খাঁটি ভার্চুয়াল ফাংশনটি একটি ভার্চুয়াল সদস্য ফাংশন যা কোনও বাস্তবায়ন না হিসাবে চিহ্নিত করা হয়। কোনও বেস ক্লাস সহ ক্লাসে সরবরাহিত তথ্যের সাথে এটির বাস্তবায়ন সম্ভব নয়। একটি বিমূর্ত শ্রেণি একটি বিমূর্ত বেস শ্রেণি হিসাবেও পরিচিত।

উদাহরণ

# নেমস্পেস স্টাড ক্লাস এমপ্লয়ী // অ্যাবস্ট্রাক্ট বেস ক্লাস {ভার্চুয়াল ইন্ট getSalary () = 0 // খাঁটি ভার্চুয়াল ফাংশন} শ্রেণীর কর্মচারী_: পাবলিক কর্মচারী {ইন্ট বেতনের পাবলিক: এমপ্লয়ী_1 (ইন্ট এস) {বেতন = এস} ইন্ট গেটসালারি () ব্যবহার করে অন্তর্ভুক্ত করুন {রিটার্ন বেতন}} শ্রেণীর কর্মচারী ৩: পাবলিক কর্মচারী {ইন্ট বেতনের পাবলিক: কর্মচারী ৩ (ইনটার্ট টি) {বেতন = টি} ইন্ট গেটসেলারি () {রিটার্ন বেতন}} ইনট মেইন () {কর্মচারী ই ই (5000) কর্মচারী 3 ই 2 (3000) ইনট্রি a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

আউটপুট

সি ++ এ নামস্থান কী

ব্যাখ্যা
শ্রেণীর কর্মচারীর 'getSalary ()' ফাংশনটি একটি খাঁটি ভার্চুয়াল ফাংশন। যেহেতু কর্মী শ্রেণিতে বিশুদ্ধ ভার্চুয়াল ফাংশন রয়েছে তাই এটি একটি বিমূর্ত বেস শ্রেণি।
যেহেতু খাঁটি ভার্চুয়াল ফাংশনটি উপশ্রেণীতে সংজ্ঞায়িত করা হয়েছে, সুতরাং কর্মচারী_1 এবং কর্মচারী 3 এ কর্মচারী i.e শ্রেণীর সাবক্লাস উভয়টিতেই 'getSalary ()' ফাংশনটি সংজ্ঞায়িত করা হয়েছে।

C ++ এ ভার্চুয়াল ফাংশন সম্পর্কিত এই নিবন্ধটি নিয়ে চলছে

ভার্চুয়াল ফাংশন জন্য উদাহরণ

# নেমস্পেস স্ট্যান্ড ক্লাস বেস ব্যবহার করে অন্তর্ভুক্ত করুন {সর্বজনীন: শূন্য ফাংশন_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout ফাংশন_2 () পিটিআর-> ফাংশন_3 () পিটিআর-> ফাংশন (()}

আউটপুট

ব্যাখ্যা
ফাংশন_1 () ফাংশন কলের জন্য, ফাংশনটির বেস শ্রেণীর সংস্করণ বলা হয়, ফাংশন_2 () ডেরিভেড ক্লাসে ওভাররাইড করা হয় তাই ডেরিভেট ক্লাস ভার্সন বলা হয়, ফাংশন 14 () ডায়ারভেড ক্লাসে ওভাররাইড হয় না এবং ভার্চুয়াল ফাংশন তাই বেস ক্লাস ভার্সন বলা হয়, একইভাবে ফাংশন_4 () ওভাররাইড হয় না তাই বেস শ্রেণীর সংস্করণ বলা হয়।

এইভাবে আমরা ‘সি ++ এ ভার্চুয়াল ফাংশন’ সম্পর্কিত এই নিবন্ধটির শেষে এসেছি। আপনি যদি আরও শিখতে চান তবে এটি দেখুন এডুরেকা, একটি বিশ্বস্ত অনলাইন লার্নিং সংস্থা। এডুরেকার জাভা জে 2 ইই এবং এসওএ প্রশিক্ষণ এবং শংসাপত্রের কোর্সটি হিবারনেট ও স্প্রিংয়ের মতো বিভিন্ন জাভা ফ্রেমওয়ার্কের পাশাপাশি আপনাকে মূল এবং উন্নত জাভা উভয় ধারণার জন্য প্রশিক্ষণের জন্য তৈরি করা হয়েছে।

আমাদের জন্য একটি প্রশ্ন আছে? দয়া করে এই ব্লগের মন্তব্য বিভাগে এটি উল্লেখ করুন এবং আমরা যত তাড়াতাড়ি সম্ভব আপনার কাছে ফিরে আসব।