কম্পিউটার টিউটোরিয়াল

C++-এ ডেরাইভড ক্লাস মেথডে অধিক সীমাবদ্ধ অ্যাক্সেস দিলে কী হয়?


সিনেরিও

বেস ক্লাসে 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() কল হয়। রানটাইমে অ্যাক্সেস স্পেসিফায়ার চেক হয় না।
  • ফলাফল: ডেরাইভড ক্লাসের প্রাইভেট ফাংশন বেস পয়েন্টার দিয়ে কল হয়ে যায়।

মूल মন্ত্র

অ্যাক্সেস স্পেসিফায়ার কম্পাইল-টাইম চেক, ভার্চুয়াল ডিসপ্যাচ রান-টাইম। ডেরাইভড ক্লাসে অ্যাক্সেস সীমিত করলেও বেস পয়েন্টার দিয়ে কল সম্ভব।

  1. C++-এ ফ্রেন্ড ক্লাস এবং ফাংশন

  2. C++-এ অ্যারো অপারেটর (->) কী?

  3. C++-এ ডট অপারেটর (.) কী?

  4. C++-এ অ্যাক্সেস মডিফায়ার