আপনার প্রশ্নের শব্দটি বিচার করে (আপনি "লুকোচুরি" শব্দটি ব্যবহার করেছিলেন) আপনি ইতিমধ্যে জানেন যে এখানে কী চলছে। ঘটনাটিকে বলা হয় "নাম গোপন করা"। কোনও কারণে, যখনই কেউ নাম জিজ্ঞাসা কেন ঘটে সে সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করে , যারা প্রতিক্রিয়া জানায় তারা এইটিকে "নাম গোপন করা" বলে এবং এটি কীভাবে কাজ করে তা ব্যাখ্যা করে (যা আপনি সম্ভবত ইতিমধ্যে জানেন), বা কীভাবে ওভাররাইড করবেন তা ব্যাখ্যা করুন (যা আপনি কখনও জিজ্ঞাসা করা হয়নি), কিন্তু কেউই "কেন" প্রশ্নটির মূল সমাধান করতে পারে বলে মনে করেন না।
সিদ্ধান্ত, নাম গোপনের পিছনে যুক্তি, অর্থাত্ কেন এটি আসলে সি ++ এ নকশা করা হয়েছিল, তা হ'ল নির্দিষ্ট ওষুধহীন, অপ্রত্যাশিত এবং সম্ভাব্য বিপজ্জনক আচরণ এড়াতে হবে যদি ওভারলোডেড ফাংশনগুলির উত্তরাধিকার সূত্রে বর্তমান সেটটির সাথে মিশ্রিত হওয়ার অনুমতি দেওয়া হয়েছিল প্রদত্ত শ্রেণিতে অতিরিক্ত চাপ s আপনি সম্ভবত জানেন যে সি ++ ওভারলোডের রেজোলিউশন প্রার্থীদের সেট থেকে সেরা ফাংশন বেছে নিয়ে কাজ করে। এটি পরামিতিগুলির ধরণের সাথে যুক্তির ধরণের সাথে মিলে যায়। ম্যাচের নিয়মগুলি অনেক সময় জটিল হতে পারে এবং প্রায়শই এমন ফলাফলের দিকে নিয়ে যায় যে কোনও অপ্রস্তুত ব্যবহারকারীর দ্বারা অযৌক্তিক হিসাবে বিবেচিত হতে পারে। পূর্ববর্তী বিদ্যমানগুলির একটি সংস্থায় নতুন ফাংশন যুক্ত করার ফলে ওভারলোড রেজোলিউশনের ফলাফলের পরিবর্তে কঠোর স্থানান্তর হতে পারে।
উদাহরণস্বরূপ, ধরা যাক বেস ক্লাসে B
একটি সদস্য ফাংশন থাকে foo
যা টাইপের একটি প্যারামিটার নেয় void *
এবং সমস্ত কলগুলি foo(NULL)
সমাধান করা হয় B::foo(void *)
। আসুন বলে রাখুন যে কোনও নাম গোপন নেই এবং এটি B::foo(void *)
থেকে নেমে আসা বিভিন্ন শ্রেণিতে এটি দৃশ্যমান B
। তবে, আসুন আমরা D
ক্লাসের কিছু [পরোক্ষ, দূরবর্তী] বংশধরকে B
একটি ফাংশন foo(int)
সংজ্ঞায়িত করা হয়। এখন, নাম গোপন ছাড়া D
উভয় হয়েছে foo(void *)
এবং foo(int)
দৃশ্যমান এবং জমিদার রেজল্যুশন অংশগ্রহণ। কোন কলগুলি কী foo(NULL)
ধরণের কোনও অবজেক্টের মাধ্যমে তৈরি করা হলে তা সমাধান করবেD
? তারা সমাধান করবে D::foo(int)
, যেহেতু int
অবিচ্ছেদ্য শূন্যের জন্য আরও ভাল ম্যাচ (যেমন ieNULL
) যে কোনও পয়েন্টার প্রকারের চেয়ে। সুতরাং, ক্রিয়াকলাপ জুড়ে foo(NULL)
একটি ক্রিয়াকলাপের সমাধানের জন্য আহ্বান জানানো হয় , যখন D
(এবং এর নীচে) তারা হঠাৎ অন্যটির কাছে সমাধান করে।
আর একটি উদাহরণ দেওয়া হয়েছে ডিজিটাল অ্যান্ড ইভোলিউশন এর সি ++ এর পৃষ্ঠা page 77:
class Base {
int x;
public:
virtual void copy(Base* p) { x = p-> x; }
};
class Derived{
int xx;
public:
virtual void copy(Derived* p) { xx = p->xx; Base::copy(p); }
};
void f(Base a, Derived b)
{
a.copy(&b); // ok: copy Base part of b
b.copy(&a); // error: copy(Base*) is hidden by copy(Derived*)
}
এই নিয়ম ব্যতীত খ এর রাজ্য আংশিকভাবে আপডেট করা হবে, ফলে টুকরো টুকরো হয়ে যাবে।
ভাষাটি তৈরি করার সময় এই আচরণটি অযাচিত মনে করা হত। আরও ভাল পদ্ধতির হিসাবে, "নাম গোপন করা" স্পেসিফিকেশন অনুসরণ করার সিদ্ধান্ত নেওয়া হয়েছিল, অর্থাত প্রতিটি ক্লাসটি প্রতিটি পদ্ধতির নামের সাথে এটি যে নামটির ঘোষণা করে তার সাথে "ক্লিন শীট" দিয়ে শুরু হয়। এই আচরণটি ওভাররাইড করার জন্য ব্যবহারকারীর কাছ থেকে একটি স্পষ্ট পদক্ষেপ নেওয়া দরকার: মূলত উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতি (গুলি) বর্তমানে পুনরায় ঘোষণা-এর ব্যবহারের স্পষ্ট ব্যবহার use
আপনি যেমনটি আপনার মূল পোস্টে সঠিকভাবে পর্যবেক্ষণ করেছেন (আমি "পলিমর্ফিক নয়" মন্তব্যটি উল্লেখ করছি), এই আচরণটি ক্লাসগুলির মধ্যে আইএস-এ সম্পর্কের লঙ্ঘন হিসাবে দেখা যেতে পারে। এটি সত্য, তবে আপাতদৃষ্টিতে ফিরে এসে সিদ্ধান্ত নেওয়া হয়েছিল যে শেষ নামটি গোপন করা একটি কম মন্দ হিসাবে প্রমাণিত হবে।