C++ Academy · पाठ

स्थैतिक बहुरूपता

virtual call का ओवरहेड टालें

पाठ 2, कुल 4 में से13 चरण

स्थैतिक बहुरूपता, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

बहुरूपता के दो प्रकार

C++ बहुरूपता के दो रूपों का समर्थन करता है।

  • गतिशील: वर्चुअल फ़ंक्शन का समाधान रनटाइम पर वर्चुअल तालिका के माध्यम से होता है
  • स्थैतिक: टेम्पलेट/CRTP का समाधान संकलन-समय पर होता है

स्थैतिक बहुरूपता अधिक गति के बदले कम लचीलापन देती है।

virtual की लागत

वर्चुअल कॉल के लिए वर्चुअल तालिका के माध्यम से अप्रत्यक्ष छलाँग लगानी पड़ती है। कंपाइलर आमतौर पर इसे inline नहीं कर पाता, जिससे कई अनुकूलन रुक जाते हैं।

#include <iostream>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};

struct Square : Shape {
    double s;
    Square(double x) : s(x) {}
    double area() const override { return s * s; }
};

int main() {
    Shape* p = new Square(3);
    std::cout << p->area() << "\n";
    delete p;
    return 0;
}

CRTP के साथ स्थैतिक डिस्पैच

CRTP में बेस संकलन-समय कास्ट के माध्यम से व्युत्पन्न विधि को सीधे कॉल करता है, इसलिए कंपाइलर सब कुछ inline कर सकता है।

#include <iostream>

template <typename T>
struct Shape {
    double area() const { return static_cast<const T*>(this)->area(); }
};

struct Square : Shape<Square> {
    double s;
    Square(double x) : s(x) {}
    double area() const { return s * s; }
};

int main() {
    Square sq(3);
    std::cout << sq.area() << "\n";
    return 0;
}

फ़ॉरवर्डर का नामकरण

जब बेस और व्युत्पन्न दोनों area परिभाषित करते हों, तो बेस फ़ॉरवर्डर को compute जैसा अलग नाम दें, ताकि वह अस्पष्टता के बिना व्युत्पन्न कार्यान्वयन को कॉल करे।

#include <iostream>

template <typename T>
struct Shape {
    double compute() const { return static_cast<const T*>(this)->area(); }
};

struct Circle : Shape<Circle> {
    double r;
    Circle(double x) : r(x) {}
    double area() const { return 3.14159 * r * r; }
};

int main() {
    Circle c(2);
    std::cout << c.compute() << "\n";
    return 0;
}

स्थैतिक बहुरूपता के रूप में टेम्पलेट

साधारण फ़ंक्शन टेम्पलेट भी स्थैतिक बहुरूपता का एक रूप हैं: आवश्यक इंटरफ़ेस प्रदान करने वाले किसी भी प्रकार के लिए वही कोड काम करता है (संकलन-समय पर डक-टाइपिंग)।

#include <iostream>

struct Dog { void speak() const { std::cout << "Woof\n"; } };
struct Cat { void speak() const { std::cout << "Meow\n"; } };

template <typename Animal>
void make_speak(const Animal& a) { a.speak(); }

int main() {
    make_speak(Dog{});
    make_speak(Cat{});
    return 0;
}

जब प्रकार ज्ञात हो

स्थैतिक बहुरूपता तभी लागू होती है जब ठोस प्रकार संकलन समय पर ज्ञात हो। यदि आपको विषम वस्तुओं को एक ही कंटेनर में रखना हो और रनटाइम पर व्यवहार चुनना हो, तो आपको अभी भी वर्चुअल फ़ंक्शन की आवश्यकता होगी।

विषम कंटेनर नहीं

आप Shape<Square> और Shape<Circle> को एक ही std::vector में साझा आधार के रूप में नहीं रख सकते, क्योंकि ये असंबंधित प्रकार हैं। यही स्थैतिक बहुरूपता की मुख्य सीमा है।

प्रदर्शन लाभ

डिस्पैच किए गए कॉल को इनलाइन करके कंपाइलर नियतांकों को समेट सकता है और फ़ंक्शन-कॉल का अतिरिक्त खर्च पूरी तरह हटा सकता है। एक ही ज्ञात प्रकार पर चलने वाले कसे हुए लूप में स्थैतिक बहुरूपता काफ़ी तेज़ हो सकती है।

#include <iostream>

template <typename T>
struct Op {
    int apply(int x) const { return static_cast<const T*>(this)->apply(x); }
};

struct Doubler : Op<Doubler> {
    int apply(int x) const { return x * 2; }
};

int main() {
    Doubler d;
    int sum = 0;
    for (int i = 0; i < 5; ++i) sum += d.apply(i);
    std::cout << sum << "\n";
    return 0;
}

दोनों का संयोजन

जहाँ गति महत्वपूर्ण हो वहाँ CRTP का उपयोग किया जा सकता है और जहाँ प्रकार-विलोपन आवश्यक हो वहाँ एक पतला वर्चुअल आवरण रखा जा सकता है। इससे महत्वपूर्ण स्थानों पर गति और आवश्यक स्थानों पर लचीलापन मिलता है।

स्थैतिक इंटरफ़ेस जाँच

यदि कोई व्युत्पन्न वर्ग आवश्यक विधि लागू करना भूल जाता है, तो त्रुटि रनटाइम पर नहीं बल्कि तब संकलन समय पर दिखाई देती है जब आधार फ़ॉरवर्डर का इंस्टैंस बनाया जाता है।

#include <iostream>

template <typename T>
struct Greeter {
    void greet() const { static_cast<const T*>(this)->hello(); }
};

struct English : Greeter<English> {
    void hello() const { std::cout << "Hello\n"; }
};

int main() {
    English{}.greet();
    return 0;
}

सही उपकरण चुनना

स्थैतिक बहुरूपता का उपयोग तब करें जब:

  • प्रकार संकलन समय पर ज्ञात हो
  • प्रदर्शन अत्यंत महत्वपूर्ण हो
  • आपको किसी साझा रनटाइम आधार प्रकार की आवश्यकता न हो

अन्यथा स्पष्टता और लचीलेपन के लिए वर्चुअल फ़ंक्शन को प्राथमिकता दें।

त्वरित जाँच

स्थैतिक बहुरूपता का मुख्य समझौता चुनिए।

पुनरावलोकन

आपने स्थैतिक और गतिशील बहुरूपता की तुलना की।

  • वर्चुअल = रनटाइम डिस्पैच, वर्चुअल तालिका, विषम कंटेनर
  • CRTP/टेम्पलेट = संकलन-समय डिस्पैच, इनलाइन किया जा सकने वाला, अधिक तेज़
  • स्थैतिक बहुरूपता के लिए प्रकार का संकलन समय पर ज्ञात होना आवश्यक है
  • लचीलेपन और प्रदर्शन की आवश्यकता के आधार पर चुनाव करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ C++ सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

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

क्या “स्थैतिक बहुरूपता” पाठ निःशुल्क है?

हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “स्थैतिक बहुरूपता” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“स्थैतिक बहुरूपता” में मैं क्या सीखूँगा?

virtual call का ओवरहेड टालें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“स्थैतिक बहुरूपता” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. CRTP मुहावरा
  2. स्थैतिक बहुरूपता
  3. CRTP के साथ Mixin
  4. CRTP का उपयोग कब करें
← C++ Academy पर वापस जाएँ