Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🟣 OOP  ·  Lesson 48

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 को अनदेखा करते हुए। तुलना करें:

C++
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;
}
Output:
Derived

virtual हटाएँ और यह इसके बजाय Base print करेगा।

override keyword

जिस derived function को आप override बनाना चाहते हैं उसमें override जोड़ें। अगर यह वास्तव में किसी base virtual से मेल न खाए, compiler आपको रोकता है — signature में typos पकड़ते हुए:

C++
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 होते हैं:

C++
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 करें।
  • override compiler से आपका override सत्यापित कराता है।
  • Compilers virtual calls run time पर हल करने को vtable इस्तेमाल करते हैं।
  • Polymorphic base class को हमेशा virtual destructor दें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C++ में virtual function क्या है?
Virtual function एक member function है जो base class में 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 रिपोर्ट करता है, जो सूक्ष्म गलतियाँ जल्दी पकड़ता है।
C++ में virtual functions आंतरिक रूप से कैसे काम करते हैं?
अधिकांश compilers virtual functions को vtable से लागू करते हैं — प्रति class function pointers की एक तालिका। Polymorphic class का हर object अपनी class के vtable का एक छिपा pointer रखता है, और virtual call run time पर उस तालिका के ज़रिए सही function ढूँढता है।
C++ में virtual destructor की ज़रूरत क्यों है?
जब आप base-class pointer के ज़रिए derived object delete करते हैं, destructor virtual होना चाहिए ताकि derived destructor भी चले। Virtual destructor के बिना केवल base हिस्सा नष्ट होता है, derived class के resources leak करते हुए, तो polymorphic base classes में हमेशा एक होना चाहिए।
C++ में overriding और function hiding में क्या अंतर है?
Overriding base virtual function को मेल खाते derived से बदलता है, run time पर चुना गया। Function hiding तब होता है जब derived class एक ही नाम का function घोषित करे पर base version virtual न हो या signature भिन्न हो, तो base version बस छिप जाता है बजाय polymorphically override होने के।
← Back to C++ Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
अगला topicAbstract Classes and Pure Virtual Functions आपकी प्रगति: 48 / 81 (59%) · Lesson 49 / 81 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें