উত্তরাধিকার
উত্তরাধিকারের পুরো বিষয়টি হ'ল অনেকগুলি বাস্তবায়নের মধ্যে একটি সাধারণ ইন্টারফেস এবং প্রোটোকল ভাগ করে নেওয়া যে কোনও উদ্ভূত শ্রেণীর উদাহরণটি অন্য কোনও উদ্ভূত প্রকারের থেকে অন্য কোনও ঘটনার সাথে একইভাবে বিবেচনা করা যেতে পারে।
সি ++ এ উত্তরাধিকার এছাড়াও এর সাথে বাস্তবায়নের বিশদ নিয়ে আসে, ডেস্ট্রাক্টরকে ভার্চুয়াল হিসাবে চিহ্নিত (বা চিহ্নিত না করে) এমনই একটি বাস্তবায়ন বিশদ।
ফাংশন বাইন্ডিং
এখন যখন কোনও ফাংশন, বা এর কোনও বিশেষ ক্ষেত্রে যেমন কনস্ট্রাক্টর বা ডেস্ট্রাক্টর ডাকা হয় তখন সংকলকটিকে অবশ্যই বেছে নিতে হবে কোন ফাংশন বাস্তবায়ন বোঝানো হয়েছিল। তারপরে এটি অবশ্যই মেশিন কোড উত্পন্ন করবে যা এই উদ্দেশ্যটি অনুসরণ করে।
এটির কাজ করার সহজতম উপায় হ'ল সংকলনের সময় ফাংশনটি নির্বাচন করা এবং পর্যাপ্ত পরিমাণে মেশিন কোড নির্গত করা যাতে কোনও মান নির্বিশেষে, যখন কোডটির এই অংশটি কার্যকর করে, এটি সর্বদা ফাংশনটির জন্য কোড চালায়। উত্তরাধিকার বাদে এটি দুর্দান্ত কাজ করে।
আমাদের যদি কোনও ফাংশন সহ বেস ক্লাস থাকে (কনস্ট্রাক্টর বা ডেস্ট্রাক্টর সহ কোনও ফাংশন হতে পারে) এবং আপনার কোডটিতে কোনও ফাংশন কল করে, এর অর্থ কী?
আপনার উদাহরণ থেকে গ্রহণ, যদি আপনি নামক initialize_vector()
কম্পাইলার যদি সত্যিই পাওয়া বাস্তবায়ন কল বোঝানো সিদ্ধান্ত নিতে হয়েছে Base
, অথবা বাস্তবায়ন পাওয়া Derived
। এটি সিদ্ধান্ত নেওয়ার দুটি উপায় রয়েছে:
- প্রথম সিদ্ধান্ত নিতে যে কারণ আপনি একটি থেকে বলা হয়
Base
টাইপ, আপনি বাস্তবায়ন বোঝানো Base
।
- দ্বিতীয়টি সিদ্ধান্ত নিতে হয় যেহেতু টাইপ করা মূল্যে সঞ্চিত মানের রানটাইম টাইপ
Base
হতে পারে Base
, বা Derived
কোন কল করতে হবে তা সিদ্ধান্ত নেওয়ার সময় রানটাইমে করা উচিত (প্রতিবার যখন এটি বলা হয়)।
এই মুহূর্তে সংকলক বিভ্রান্ত, উভয় বিকল্প সমানভাবে বৈধ। এই virtual
মিশ্রণে আসে যখন । যখন এই কীওয়ার্ডটি উপস্থিত থাকে তখন কোডটি একটি আসল মান সহ চলমান অবধি সমস্ত সম্ভাব্য প্রয়োগের মধ্যে সিদ্ধান্ত বিলম্ব করে সংকলক পিক্স বিকল্প 2 2 যখন এই কীওয়ার্ডটি অনুপস্থিত থাকে তখন সংকলকটি বিকল্পটি বেছে নেয় 1 কারণ অন্যথায় এটি স্বাভাবিক আচরণ।
ভার্চুয়াল ফাংশন কলের ক্ষেত্রে সংকলকটি এখনও বিকল্প 1 বেছে নিতে পারে। তবে কেবল যদি এটি প্রমাণ করতে পারে যে এটি সর্বদা ক্ষেত্রে থাকে।
নির্মাণকারী এবং ধ্বংসকারী
সুতরাং কেন আমরা একটি ভার্চুয়াল কনস্ট্রাক্টর নির্দিষ্ট করে না?
আরো intuitively, কিভাবে কম্পাইলার নির্মাণকারী এর অভিন্ন বাস্তবায়নের মধ্যে বাছাই করবে Derived
এবং Derived2
? এটি বেশ সহজ, এটি পারে না। পূর্ব-বিদ্যমান কোনও মান নেই যা থেকে সংকলকটি জানতে পারে যে আসলে কী ছিল। পূর্ব-অস্তিত্বের মান নেই কারণ এটি নির্মাণকারীর কাজ।
তাহলে কেন আমাদের ভার্চুয়াল ডেস্ট্রাক্টর নির্দিষ্ট করা দরকার?
আরও স্বজ্ঞাতভাবে কীভাবে সংকলক Base
এবং এর জন্য বাস্তবায়নগুলির মধ্যে নির্বাচন করবেন Derived
? এগুলি কেবল ফাংশন কল, সুতরাং ফাংশন কল আচরণ ঘটে। কোনও ঘোষিত ভার্চুয়াল ডেস্ট্রাক্টর ছাড়াই সংকলক Base
মান রানটাইম টাইপের নির্বিশেষে সরাসরি ডেস্ট্রাক্টরের সাথে আবদ্ধ করার সিদ্ধান্ত নেবে ।
অনেক সংকলকগুলিতে, যদি উত্পন্ন কোনও ডেটা সদস্য হিসাবে ঘোষণা না করে বা অন্যান্য ধরণের থেকে উত্তরাধিকারী না হয় তবে এর আচরণটি ~Base()
উপযুক্ত হবে, তবে এটির গ্যারান্টি নেই। এটি ঘটনাক্রমে শুদ্ধভাবে কাজ করবে, অনেকটা আগুন জ্বলানো হয়নি এমন আগুনের সামনে দাঁড়িয়ে থাকার মতো। আপনি কিছুক্ষণের জন্য ভাল আছেন।
সি ++ তে কোনও বেস বা ইন্টারফেস ধরণের ঘোষণা করার একমাত্র সঠিক উপায় হ'ল ভার্চুয়াল ডেস্ট্রাক্টর ঘোষণা করা, যাতে সঠিক ধরণের ডেস্ট্রাক্টরকে সেই ধরণের ধরণের শ্রেণিবিন্যাসের কোনও নির্দিষ্ট উদাহরণের জন্য ডাকা হয়। এটি উদাহরণটির সবচেয়ে জ্ঞান সহ ফাংশনটিকে সেই দৃষ্টিকোণটি সঠিকভাবে পরিষ্কার করতে দেয়।
~derived()
যা ভিসির ডেস্ট্রাক্টরকে প্রতিনিধি করে। বিকল্পভাবে, আপনি ধরে নিচ্ছেন যেunique_ptr<base> pt
উদ্ভূত ধ্বংসকারীকে জানতে পারে know ভার্চুয়াল পদ্ধতি ছাড়া এটি হওয়া যায় না। যদিও কোনও অনন্য_পিটারকে কোনও মুছে ফাংশন দেওয়া যেতে পারে যা কোনও রানটাইম উপস্থাপনা ছাড়াই একটি টেম্পলেট প্যারামিটার এবং এই বৈশিষ্ট্যটি এই কোডটির জন্য কোনও কাজ নয়।