এখানে একটি রুনডাউন রয়েছে static_cast<>এবং dynamic_cast<>বিশেষত তারা পয়েন্টারগুলির সাথে সম্পর্কিত। এটি মাত্র 101-স্তরের রুনডাউন, এটি সমস্ত জটিলতা জুড়ে না।
স্ট্যাটিক_কাস্ট <প্রকার *> (পিটিআর)
এটি পয়েন্টারটি ভিতরে নিয়ে যায় ptrএবং এটিকে নিরাপদে টাইপের একটি পয়েন্টারে কাস্ট করার চেষ্টা করে Type*। এই castালাই সংকলন সময়ে করা হয়। প্রকারের প্রকারগুলি সম্পর্কিত হলে এটি কেবল theালাই সঞ্চালন করবে। প্রকারগুলি সম্পর্কিত না হলে আপনি একটি সংকলক ত্রুটি পাবেন। উদাহরণ স্বরূপ:
class B {};
class D : public B {};
class X {};
int main()
{
D* d = new D;
B* b = static_cast<B*>(d); // this works
X* x = static_cast<X*>(d); // ERROR - Won't compile
return 0;
}
গতিশীল_কাস্ট <প্রকার *> (পিটিআর)
এটি আবার পয়েন্টারটি ভিতরে নিয়ে যাওয়ার চেষ্টা করে ptrএবং নিরাপদে টাইপের একটি পয়েন্টারে রেখে দেয় Type*। তবে এই castালাই রানটাইম সময়ে কার্যকর করা হয়, সংকলনের সময় নয়। যেহেতু এটি একটি রান-টাইম castালাই, এটি বিশেষত পলিমারফিক ক্লাসগুলির সাথে মিলিত হয়ে কার্যকর হয়। প্রকৃতপক্ষে, সত্যিকারের ক্ষেত্রে কাস্টগুলি বৈধ হওয়ার জন্য ক্লাসগুলি অবশ্যই বহুকর্মী হতে হবে।
বর্ণগুলি দুটি দিকের একটিতে যেতে পারে: বেস থেকে প্রাপ্ত (বি 2 ডি) বা বেস থেকে প্রাপ্ত (ডি 2 বি) থেকে। এটি D2B কাস্টগুলি রানটাইমে কীভাবে কাজ করবে তা দেখার পক্ষে যথেষ্ট সহজ। হয় হয় ptrথেকে প্রাপ্ত হয়েছে Typeবা এটি ছিল না। D2B ডায়নামিক_কাস্ট <> এর ক্ষেত্রে, নিয়মগুলি সহজ। আপনি অন্য যে কোনও কিছুতে কাস্ট করার চেষ্টা করতে পারেন, এবং যদি ptrবাস্তবে উত্পন্ন হয় তবে Typeআপনি Type*পয়েন্টারটি ফিরে পাবেন dynamic_cast। অন্যথায়, আপনি একটি নাল পয়েন্টার পাবেন।
তবে বি 2 ডি কাস্টগুলি কিছুটা জটিল। নিম্নলিখিত কোড বিবেচনা করুন:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void DoIt() = 0; // pure virtual
virtual ~Base() {};
};
class Foo : public Base
{
public:
virtual void DoIt() { cout << "Foo"; };
void FooIt() { cout << "Fooing It..."; }
};
class Bar : public Base
{
public :
virtual void DoIt() { cout << "Bar"; }
void BarIt() { cout << "baring It..."; }
};
Base* CreateRandom()
{
if( (rand()%2) == 0 )
return new Foo;
else
return new Bar;
}
int main()
{
for( int n = 0; n < 10; ++n )
{
Base* base = CreateRandom();
base->DoIt();
Bar* bar = (Bar*)base;
bar->BarIt();
}
return 0;
}
main()কী ধরণের অবজেক্ট CreateRandom()ফিরে আসবে তা বলতে পারে না , তাই সি-স্টাইলের কাস্টটি Bar* bar = (Bar*)base;সিদ্ধান্ত নিয়ে টাইপ-নিরাপদ নয়। আপনি কিভাবে এটি ঠিক করতে পারেন? একটি উপায় হ'ল AreYouABar() const = 0;বেস শ্রেণিতে বুলের মতো একটি ফাংশন যুক্ত trueকরা Barএবং falseসেখান থেকে ফিরে আসা Foo। তবে আরও একটি উপায় রয়েছে: ব্যবহার করুন dynamic_cast<>:
int main()
{
for( int n = 0; n < 10; ++n )
{
Base* base = CreateRandom();
base->DoIt();
Bar* bar = dynamic_cast<Bar*>(base);
Foo* foo = dynamic_cast<Foo*>(base);
if( bar )
bar->BarIt();
if( foo )
foo->FooIt();
}
return 0;
}
কাস্টগুলি রানটাইমের সময় কার্যকর হয় এবং অবজেক্টটিকে জিজ্ঞাসাবাদ করে (এখন কীভাবে তা চিন্তা করার দরকার নেই) কাজ করে, এটি জিজ্ঞাসা করে যে এটি আমরা কী ধরণের সন্ধান করছি। যদি তা হয় তবে dynamic_cast<Type*>একটি পয়েন্টার দেয়; অন্যথায় এটি NULL ফেরত দেয়।
এই বেস-থেকে-উত্পন্ন dynamic_cast<>কাস্টিংটি ব্যবহার করে কাজ করার জন্য , বেস, ফু এবং বার অবশ্যই স্ট্যান্ডার্ডকে পলিমারফিক প্রকার বলে । পলিমারফিক টাইপ হওয়ার জন্য আপনার ক্লাসে কমপক্ষে একটি virtualফাংশন থাকতে হবে। যদি আপনার ক্লাসগুলি পলিমারফিক ধরণের না হয় তবে এর ভিত্তি থেকে প্রাপ্ত উত্পন্ন ব্যবহারটি dynamic_castসংকলন করবে না। উদাহরণ:
class Base {};
class Der : public Base {};
int main()
{
Base* base = new Der;
Der* der = dynamic_cast<Der*>(base); // ERROR - Won't compile
return 0;
}
একটি ভার্চুয়াল ফাংশন যেমন বেসে একটি ভার্চুয়াল ফাংশন যুক্ত করা হলে বেস এবং ডের উভয়ই বহুপ্রকার তৈরি করে:
class Base
{
public:
virtual ~Base(){};
};
class Der : public Base {};
int main()
{
Base* base = new Der;
Der* der = dynamic_cast<Der*>(base); // OK
return 0;
}
dynamic_cast<>পর্দার আড়ালে কীভাবে কাজ করে (বা কতটা সি ++ কাজ করে) এর একটি ভাল ধারণা পেতে চান তবে একটি ভাল বই (এটি এত প্রযুক্তিগত কোনও কিছুর জন্য পড়াও বেশ সহজ) হ'ল লিপম্যানের "ইনসাইড দ্য সি ++ অবজেক্ট মডেল"। এছাড়াও স্ট্রস্ট্রুপের "ডিজাইন অ্যান্ড ইভোলিউশন অফ সি ++" এবং "দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ" বইগুলি ভাল সংস্থান, তবে লিপম্যানের বইটি কীভাবে সি ++ 'পর্দার আড়ালে' কাজ করে তা উত্সর্গীকৃত।