সিনেরিও
বেস ক্লাসে public virtual ফাংশন, ডেরাইভড ক্লাসে সেটি private করে ওভাররাইড করা।
কেস ১: ডেরাইভড অবজেক্ট দিয়ে কল (এরর)
class BaseClass {
public:
virtual void display() { cout << "Base class" << endl; }
};
class DerivedClass: public BaseClass {
private:
void display() { cout << "Derived class" << endl; }
};
int main() {
DerivedClass d;
d.display(); // Error: private access
}
error: 'virtual void DerivedClass::display()' is private within this context
কেস ২: বেস ক্লাস পয়েন্টার দিয়ে কল (সফল)
int main() {
BaseClass *b = new DerivedClass;
b->display(); // Works! Prints "Derived class"
}
Print function from the derived class
ব্যাখ্যা
- কম্পাইল টাইম: অ্যাক্সেস স্পেসিফায়ার চেক হয়। বেস ক্লাস পয়েন্টার দিয়ে কল করলে বেস ক্লাসের
public display()অ্যাক্সেসIBLE। - রান টাইম: ভার্চুয়াল ফাংশন মেকানিজম (vptr/vtable) দিয়ে ডেরাইভড ক্লাসের
display()কল হয়। রানটাইমে অ্যাক্সেস স্পেসিফায়ার চেক হয় না। - ফলাফল: ডেরাইভড ক্লাসের প্রাইভেট ফাংশন বেস পয়েন্টার দিয়ে কল হয়ে যায়।
মूल মন্ত্র
অ্যাক্সেস স্পেসিফায়ার কম্পাইল-টাইম চেক, ভার্চুয়াল ডিসপ্যাচ রান-টাইম। ডেরাইভড ক্লাসে অ্যাক্সেস সীমিত করলেও বেস পয়েন্টার দিয়ে কল সম্ভব।