বিষয়টির প্রশ্নটি বেশ সাধারণ বিভ্রান্তির পরামর্শ দেয়। বিভ্রান্তিটি যথেষ্ট সাধারণ, যে সি ++ এফএকিউ দীর্ঘকাল ধরে ব্যক্তিগত ভার্চুয়ালগুলি ব্যবহার করার পক্ষে সমর্থন করেছিল, কারণ বিভ্রান্তি একটি খারাপ জিনিস বলে মনে হয়েছিল।
তাই প্রথমে বিভ্রান্তি থেকে মুক্তি পাওয়ার জন্য: হ্যাঁ, ব্যাক্তিগত ভার্চুয়াল ফাংশনগুলি উত্পন্ন ক্লাসগুলিতে ওভাররাইড করা যেতে পারে। উত্সযুক্ত শ্রেণীর পদ্ধতিগুলি বেস বর্গ থেকে ভার্চুয়াল ফাংশনগুলি কল করতে পারে না, তবে তারা তাদের জন্য নিজস্ব বাস্তবায়ন সরবরাহ করতে পারে। হার্ব সাটারের মতে, বেস ক্লাসে পাবলিক নন-ভার্চুয়াল ইন্টারফেস থাকা এবং একটি বেসরকারী বাস্তবায়ন যা উত্পন্ন শ্রেণিতে অনুকূলিতকরণ করা যায়, "প্রয়োগের অনুকূলিতকরণযোগ্য আচরণের স্পেসিফিকেশন থেকে ইন্টারফেসের স্পেসিফিকেশনকে আরও পৃথক করতে" সহায়তা করে। আপনি তার "ভার্চুয়ালতা" নিবন্ধে এটি সম্পর্কে আরও পড়তে পারেন ।
আপনি যে কোডটি উপস্থাপন করেছেন তাতে আরও একটি আকর্ষণীয় বিষয় আছে, এটি আমার মতে কিছুটা মনোযোগের দাবি রাখে। পাবলিক ইন্টারফেসে ওভারলোডেড নন-ভার্চুয়াল ফাংশনগুলির একটি সেট থাকে এবং এই ফাংশনগুলি অ-সর্বজনীন, অ-ওভারলোডেড ভার্চুয়াল ফাংশনগুলি কল করে। সি ++ বিশ্বে যথারীতি এটি একটি মূর্খতা, এর একটি নাম আছে এবং অবশ্যই এটি কার্যকর। নামটি (আশ্চর্য, অবাক!)
"সর্বজনীন ওভারলোড হওয়া নন-ভার্চুয়ালগুলি সুরক্ষিত অ-ওভারলোড ভার্চুয়ালগুলি কল করে"
এটি লুকানোর নিয়মটি সঠিকভাবে পরিচালনা করতে সহায়তা করে । আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন , তবে আমি খুব শীঘ্রই এটি ব্যাখ্যা করার চেষ্টা করব।
ভাবুন, Engine
শ্রেণীর ভার্চুয়াল ফাংশনগুলিও এর ইন্টারফেস এবং এটি ওভারলোডেড ফাংশনগুলির একটি সেট যা খাঁটি ভার্চুয়াল নয়। যদি তারা খাঁটি ভার্চুয়াল হয় তবে নীচের বর্ণিত হিসাবে কেউ একই সমস্যাটির মুখোমুখি হতে পারে তবে শ্রেণীর শ্রেণিবিন্যাসের চেয়ে কম।
class Engine
{
public:
virtual void SetState( int var, bool val ) {/*some implementation*/}
virtual void SetState( int var, int val ) {/*some implementation*/}
};
এখন ধরে নেওয়া যাক আপনি একটি উদ্ভূত শ্রেণি তৈরি করতে চান এবং আপনাকে কেবল পদ্ধতির জন্য একটি নতুন বাস্তবায়ন সরবরাহ করতে হবে, এটি দুটি যুক্তি হিসাবে যুক্তি হিসাবে গ্রহণ করে।
class MyTurbochargedV8 : public Engine
{
public:
// To prevent SetState( int var, bool val ) from the base class,
// from being hidden by the new implementation of the other overload (below),
// you have to put using declaration in the derived class
using Engine::SetState;
void SetState( int var, int val ) {/*new implementation*/}
};
যদি আপনি উদ্ভট ক্লাসে ব্যবহারের ঘোষণাটি (অথবা দ্বিতীয় ওভারলোডটিকে নতুন সংজ্ঞা দিতে) রাখতে ভুলে যান তবে আপনি নীচের দৃশ্যে সমস্যায় পড়তে পারেন।
MyTurbochargedV8* myV8 = new MyTurbochargedV8();
myV8->SetState(5, true);
আপনি যদি Engine
সদস্যদের আড়াল না করে থাকেন তবে বিবৃতি:
myV8->SetState(5, true);
কল করবে void SetState( int var, int val )
উদ্ভূত বর্গ থেকে, রূপান্তর true
করার int
।
যদি ইন্টারফেসটি ভার্চুয়াল না হয় এবং ভার্চুয়াল বাস্তবায়ন অ-জনসাধারণের মতো আপনার এক্সপ্লোরের মতো, উদ্ভূত শ্রেণীর লেখকটির সম্পর্কে ভাবতে কম সমস্যা হয় এবং কেবল লিখতে পারেন
class MyTurbochargedV8 : public Engine
{
private:
void SetStateInt(int var, int val ) {/*new implementation*/}
};