আপনি এই উত্তরগুলির সাথে হাইপোপটিকালগুলিতে পড়ছেন, সুতরাং আমি স্বচ্ছতার জন্য পৃথিবীর ব্যাখ্যাকে আরও সহজ করে তুলতে চেষ্টা করব।
অবজেক্ট ওরিয়েন্টেড ডিজাইনের প্রাথমিক সম্পর্ক দুটি: IS-A এবং HAS-A। আমি সেগুলি তৈরি করিনি। এগুলিই তাদের বলা হয়।
আইএস-এ ইঙ্গিত দেয় যে কোনও নির্দিষ্ট বিষয়বস্তু শ্রেণীর শ্রেণিবিন্যাসের উপরে যে শ্রেণীর উপরে রয়েছে তা চিহ্নিত করে। একটি কলার বস্তু হ'ল একটি ফলের বস্তু যদি এটি ফলের শ্রেণীর একটি সাবক্লাস হয়। এর অর্থ হ'ল যে কোনও জায়গায় কোনও ফলের শ্রেণি ব্যবহার করা যেতে পারে, একটি কলা ব্যবহার করা যেতে পারে। এটি প্রতিবিম্বিত নয়, যদিও। নির্দিষ্ট শ্রেণীর জন্য যদি বলা হয় তবে আপনি একটি নির্দিষ্ট শ্রেণীর জন্য একটি বেস শ্রেণীর বিকল্প নিতে পারবেন না।
একটি-ইঙ্গিত করেছে যে কোনও বস্তু একটি সম্মিলিত শ্রেণীর অংশ এবং এর মালিকানার সম্পর্ক রয়েছে। সি ++ এর অর্থ এটি একটি সদস্য অবজেক্ট এবং এরূপ অনূদিত এটির নিষ্পত্তি করার জন্য নিজস্ব শ্রেণিতে থাকে বা নিজেকে ধ্বংস করার আগে মালিকানা বন্ধ করে দেয়।
এই দুটি ধারণা সি ++ এর মতো একাধিক উত্তরাধিকারের মডেলের চেয়ে একক-উত্তরাধিকারের ভাষায় উপলব্ধি করা আরও সহজ তবে নিয়মগুলি মূলত একই the জটিলতাটি যখন শ্রেণীর পরিচয়টি অস্পষ্ট হয় তখন কোনও কলা শ্রেণীর পয়েন্টারকে কোনও ফাংশনে পাস করা যা ফল শ্রেণীর পয়েন্টার নেয়।
ভার্চুয়াল ফাংশন হ'ল প্রথমত রান-টাইম জিনিস। এটি পলিমারফিজমের অংশ যে এটি চলমান প্রোগ্রামে ডাকা হওয়ার সময় কোন ফাংশনটি চালানো হবে তা সিদ্ধান্ত নিতে ব্যবহৃত হয়।
শ্রেণি পরিচয় সম্পর্কে অস্পষ্টতা থাকলে ভার্চুয়াল কীওয়ার্ডটি একটি নির্দিষ্ট ক্রমে ফাংশনগুলিকে আবদ্ধ করার জন্য একটি সংকলক নির্দেশিকা is ভার্চুয়াল ফাংশন সর্বদা প্যারেন্ট ক্লাসে থাকে (যতদূর আমি জানি) এবং সংকলককে নির্দেশ করে যে সদস্যদের ফাংশনগুলি তাদের নামের সাথে বাধ্যতামূলকভাবে প্রথমে সাবক্লাস ফাংশন এবং তার পরে প্যারেন্ট ক্লাস ফাংশন সহ সঞ্চালিত হওয়া উচিত।
কোনও ফলের শ্রেণিতে ভার্চুয়াল ফাংশন রঙ () থাকতে পারে যা ডিফল্টরূপে "NONE" ফেরত দেয়। কলা শ্রেণির রঙ () ফাংশনটি "ইয়েলো" বা "ব্রাউন" দেয়।
তবে যদি কোনও ফলের পয়েন্টার গ্রহণকারী ফাংশনটি কলটি পাঠানো কলা শ্রেণিতে রঙ () কল করে - কোন রঙ () ফাংশনটি চাওয়া হয়? ফাংশনটি সাধারণত একটি ফলের অবজেক্টের জন্য ফল :: রঙ () বলে would
এটি হবে 99% সময় যা ছিল তার উদ্দেশ্য ছিল না। তবে যদি ফল :: রঙ () ভার্চুয়াল হিসাবে ঘোষিত হয় তবে কলা: রঙ () অবজেক্টের জন্য কল করা হবে কারণ কল করার সময় সঠিক রঙ () ফাংশনটি ফলের পয়েন্টারে আবদ্ধ থাকবে। রানটাইম পরীক্ষা করবে যে পয়েন্টারটি কীসের দিকে ইঙ্গিত করে কারণ এটি ফল শ্রেণীর সংজ্ঞাতে ভার্চুয়াল হিসাবে চিহ্নিত হয়েছিল।
এটি একটি সাবক্লাসে কোনও ক্রিয়াকলাপকে ওভাররাইড করার চেয়ে পৃথক। সেক্ষেত্রে ফলের পয়েন্টার ফলটিকে :: :: কল (কল) কল করবে যদি সমস্ত কিছু জানা থাকে তবে তা হ'ল ফলের কাছে এটি পয়েন্টার ter
সুতরাং এখন একটি "খাঁটি ভার্চুয়াল ফাংশন" ধারণাটি আসে। এটি একটি বরং দুর্ভাগ্যজনক বাক্যাংশ কারণ পবিত্রতার সাথে এর কোনও যোগসূত্র নেই। এর অর্থ হ'ল এটি উদ্দেশ্যযুক্ত যে বেস ক্লাস পদ্ধতিটি কখনই কল করা উচিত নয়। প্রকৃতপক্ষে খাঁটি ভার্চুয়াল ফাংশন বলা যাবে না। এটি এখনও সংজ্ঞায়িত করা আবশ্যক। একটি ফাংশন স্বাক্ষর উপস্থিত থাকতে হবে। অনেক কোডার সম্পূর্ণতার জন্য একটি খালি বাস্তবায়ন করে but,, তবে সংকলক অভ্যন্তরীণভাবে একটি উত্পন্ন করবে যদি তা না হয়। সেক্ষেত্রে যখন ফাংশনটি পয়েন্টারটিকে ফলের দিকে ডাকা হয় তখনও কলা :: রঙ () বলা হবে কারণ এটি রঙ () এর একমাত্র বাস্তবায়ন।
ধাঁধাটির এখন চূড়ান্ত টুকরো: নির্মাণকারী এবং ধ্বংসকারী।
খাঁটি ভার্চুয়াল নির্মাতারা সম্পূর্ণ অবৈধ। এটা ঠিক বাইরে।
খাঁটি ভার্চুয়াল ডেস্ট্রাক্টররা সেই ক্ষেত্রে কাজ করে যা আপনি একটি বেস শ্রেণীর উদাহরণ তৈরি করতে নিষেধ করতে চান। বেস ক্লাসের ডেস্ট্রাক্টর খাঁটি ভার্চুয়াল হলে কেবল সাব ক্লাসই ইনস্ট্যান্ট করা যায়। কনভেনশনটি 0 তে নির্ধারিত হয়।
virtual ~Fruit() = 0; // pure virtual
Fruit::~Fruit(){} // destructor implementation
এই ক্ষেত্রে আপনাকে একটি বাস্তবায়ন তৈরি করতে হবে। সংকলকটি জানে যে এটি আপনি যা করছেন এবং এটি সঠিকভাবে করছেন তা নিশ্চিত করে তোলে, বা এটি দৃ or়তার সাথে অভিযোগ করে যে এটি সংকলনের জন্য প্রয়োজনীয় সমস্ত কার্যগুলির সাথে লিঙ্ক করতে পারে না। আপনি কীভাবে আপনার শ্রেণীর শ্রেণিবিন্যাসের মডেলিং করছেন সে সম্পর্কে সঠিক পথে না থাকলে ত্রুটিগুলি বিভ্রান্তিকর হতে পারে।
সুতরাং আপনাকে এই ক্ষেত্রে ফলের উদাহরণ তৈরি করতে নিষেধ করা হয়েছে, তবে কলা উদাহরণ তৈরি করার অনুমতি দেওয়া হয়েছে।
ফলের পয়েন্টারটিকে মুছার জন্য যে কলটি কলার উদাহরণ দেখায় তাতে কলার কলকে :: :: কলা () প্রথমে কল করা হবে এবং তারপরে ফাইটকে :: always ফল () বলা হবে, সর্বদা। কারণ যাই হোক না কেন, আপনি যখন সাবক্লাস ডেস্ট্রাক্টর কল করেন তখন বেস ক্লাসের ডেস্ট্রাক্টরকে অবশ্যই অনুসরণ করতে হবে।
এটা কি খারাপ মডেল? এটি নকশার পর্যায়ে আরও জটিল, হ্যাঁ, তবে এটি নিশ্চিত করতে পারে যে রান লিঙ্কে সঠিক লিঙ্কিং সম্পাদিত হয়েছে এবং একটি সাবক্লাস ফাংশন সম্পাদিত হয়েছে যেখানে ঠিক কোন সাবক্লাসটি অ্যাক্সেস করা হচ্ছে তা নিয়ে দ্বিধা রয়েছে।
আপনি যদি সি ++ লিখেন যাতে আপনি কেবল জেনারিক বা দ্বিধাদ্বন্দ্বী পয়েন্টার ছাড়াই সঠিক ক্লাস পয়েন্টারগুলির চারপাশে পাস করেন, তবে ভার্চুয়াল ফাংশনগুলি সত্যই প্রয়োজন হয় না। তবে আপনার যদি টাইমগুলির রান-টাইম নমনীয়তার প্রয়োজন হয় (অ্যাপল কলা কমলা ==> ফলের মতো) ফাংশনগুলি কম রিন্ডন্ড্যান্ট কোডের সাথে আরও সহজ এবং বহুমুখী হয়ে ওঠে। আপনাকে আর প্রতিটি ধরণের ফলের জন্য কোনও ফাংশন লিখতে হবে না এবং আপনি জানেন যে প্রতিটি ফল রঙের () এর নিজস্ব সঠিক ফাংশন দিয়ে প্রতিক্রিয়া জানাবে।
আমি আশা করি এই দীর্ঘায়িত ব্যাখ্যাটি বিষয়গুলিকে বিভ্রান্ত করার পরিবর্তে ধারণাটিকে আরও দৃif় করে তোলে। দেখার জন্য এখানে প্রচুর ভাল উদাহরণ রয়েছে এবং যথেষ্ট পরিমাণে দেখুন এবং আসলে এগুলি চালান এবং তাদের সাথে জগাখিচুড়ি করুন এবং আপনি এটি পেয়ে যাবেন।