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

C++-এ নন-ভার্চুয়াল ফাংশনের ভেতরে ভার্চুয়াল ফাংশন কল করলে কী হয়?


পলিমরফিজম নন-ভার্চুয়াল ফাংশনে

যদি একটি নন-ভার্চুয়াল ফাংশন ভেতরে ভার্চুয়াল ফাংশন কল করা হয়, তবে পলিমরফিজম কাজ করে। কল করা ফাংশন রানটাইমে অবজেক্টের টাইপ অনুযায়ী নির্ণয় হয় (vptr/vtable ব্যবহার করে)।

উদাহরণ

#include <iostream>
using namespace std;

class BaseClass {
public:
    void display() { cout << "Base class display" << endl; }
    void call_disp() {
        cout << "Calling display() from base" << endl;
        this->display(); // ভার্চুয়াল না হলেও this->display() কল
    }
};

class DerivedClass: public BaseClass {
public:
    void display() { cout << "Derived class display" << endl; }
    void call_disp() {
        cout << "Calling display() from derived" << endl;
        this->display();
    }
};

int main() {
    BaseClass *bp = new DerivedClass;
    bp->call_disp(); // BaseClass::call_disp() কল হবে, কিন্তু display() DerivedClass::display() হবে
}

আউটপুট

Calling display() from base class
Print function from the derived class

ব্যাখ্যা

  • bp->call_disp() স্ট্যাটিক্যালি BaseClass::call_disp() বাঁধা হয় (নন-ভার্চুয়াল)।
  • তবে this->display() ভেতরে display() ভার্চুয়াল, তাই রানটাইমে DerivedClass::display() কল হয়।
  • vtable: ক্লাস প্রতি ফাংশন পয়েন্টার টেবিল।
  • vptr: অবজেক্ট প্রতি vtable-এ পয়েন্টার।

নিষ্কর্ষ

ভার্চুয়াল ফাংশন যদি নন-ভার্চুয়াল ফাংশনের ভেতরে কল হয়, তবে পলিমরফিজম নিশ্চিত করা হয় vptr/vtable মেকানিজম দিয়ে।

  1. C++-এ কনস্ট্রাক্টর (Constructor)-এ ভার্চুয়াল ফাংশন কল করা

  2. C++-এ ভার্চুয়াল ডিস্ট্রাক্টর (Virtual Destructor) কখন ব্যবহার করা উচিত?

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

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