Virtual Functions
Virtual function क्या है?
Virtual function एक member function है जो base class में virtual चिह्नित होता है, derived classes द्वारा override होने को बना। इसका उद्देश्य dynamic dispatch है: जब आप इसे base-class pointer या reference के ज़रिए call करते हैं, C++ वास्तविक object का version चलाता है, pointer के type का नहीं।
यह किस समस्या को हल करता है
virtual के बिना, base pointer के ज़रिए call हमेशा base version चलाता है, override को अनदेखा करते हुए। तुलना करें:
class Base { public: virtual void hi() { cout << "Base\n"; } };
class Derived : public Base { public: void hi() override { cout << "Derived\n"; } };
int main() {
Base *p = new Derived();
p->hi(); // "Derived" — virtual ki wajah se
delete p;
}Derived
virtual हटाएँ और यह इसके बजाय Base print करेगा।
override keyword
जिस derived function को आप override बनाना चाहते हैं उसमें override जोड़ें। अगर यह वास्तव में किसी base virtual से मेल न खाए, compiler आपको रोकता है — signature में typos पकड़ते हुए:
class Shape { public: virtual double area() { return 0; } };
class Circle : public Shape {
double r;
public:
Circle(double x) : r(x) {}
double area() override { return 3.14159 * r * r; } // safe
};यह कैसे काम करता है: vtable
अधिकांश compilers इसे vtable से लागू करते हैं — प्रति-class function pointers की तालिका। हर polymorphic object अपनी class के vtable का एक छिपा pointer रखता है, और virtual call run time पर वहाँ सही function ढूँढता है। इसीलिए virtual calls में सामान्य calls पर एक छोटा overhead होता है।
Virtual destructors
अगर आप base pointer के ज़रिए derived object delete करते हैं, destructor virtual होना चाहिए — अन्यथा केवल base हिस्सा नष्ट होता है और derived resources leak होते हैं:
class Base {
public:
virtual ~Base() { cout << "~Base\n"; } // virtual destructor
};
class Derived : public Base {
public:
~Derived() { cout << "~Derived\n"; }
};
// delete (Base*)new Derived(); → pehle ~Derived phir ~Baseकिसी भी class में virtual function हो तो उसमें virtual destructor भी होना चाहिए।
Overriding बनाम hiding
सच्चे overriding को virtual base function पर मेल खाता signature चाहिए। अगर base function virtual न हो, या signatures भिन्न हों, derived function केवल base को छिपाता है — कोई dynamic dispatch नहीं। override keyword इसे गलती से होने से रोकता है।
आम गलतियाँ
virtualभूलना, तो base pointers के ज़रिए overrides अनदेखे होते हैं।- Polymorphic base में virtual destructor छोड़ना (resource leak)।
- थोड़ा अलग signature overriding के बजाय hiding पैदा करना (
overrideइस्तेमाल करें)। - Pointer/reference के बजाय object पर call करते समय dynamic dispatch की उम्मीद।
संक्षिप्त syntax reference और त्वरित उदाहरण के लिए, virtual functions syntax page देखें। व्यापक विचार के लिए, polymorphism देखें।
एक Shape base बनाएँ जिसमें virtual area() और virtual destructor हो। Circle और Rectangle derive करें। इन्हें Shape* pointers से रखें और हर area base pointer के ज़रिए print करें।
सारांश
- Virtual function सही override को run-time dispatch सक्षम करता है।
- Polymorphism के लिए इसे base pointer/reference के ज़रिए call करें।
overridecompiler से आपका override सत्यापित कराता है।- Compilers virtual calls run time पर हल करने को vtable इस्तेमाल करते हैं।
- Polymorphic base class को हमेशा virtual destructor दें।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C++ में virtual function क्या है?
virtual keyword से घोषित होता है, derived classes में override होने के लिए। जब base-class pointer या reference के ज़रिए call होता है, वास्तविक object से मेल खाता version run time पर चुना जाता है, run-time polymorphism सक्षम करते हुए।C++ में override keyword क्या करता है?
override keyword compiler को बताता है कि कोई function base class के virtual function को override करने के लिए है। अगर signature वास्तव में किसी base virtual function से मेल न खाए, compiler error रिपोर्ट करता है, जो सूक्ष्म गलतियाँ जल्दी पकड़ता है।