Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में क्लास इनहेरिटेंस कैसे रोकें


यहां हम देखेंगे कि C++ में इनहेरिटेंस कैसे रोकें। इनहेरिटेंस रोकने की अवधारणा को फाइनल क्लास के रूप में जाना जाता है।

जावा या C# में, हम फाइनल क्लासेज का उपयोग कर सकते हैं। C++ में ऐसा कोई सीधा तरीका नहीं था (C++11 से पहले)। यहां हम देखेंगे कि C++ में फाइनल क्लास का अनुकरण कैसे करें।

यहां हम एक अतिरिक्त क्लास MakeFinalClass बनाएंगे (इसका डिफ़ॉल्ट कंस्ट्रक्टर प्राइवेट है)। यह फ़ंक्शन हमारे उद्देश्य को हल करता है। मुख्य क्लास MyClass, MakeFinalClass के कंस्ट्रक्टर को कॉल कर सकती है क्योंकि वे फ्रेंड क्लासेज हैं।

एक बात ध्यान देनी है कि MakeFinalClass एक वर्चुअल बेस क्लास भी है। हम इसे वर्चुअल बेस क्लास बनाते हैं क्योंकि हम चाहते हैं कि MakeFinalClass का कंस्ट्रक्टर MyDerivedClass के कंस्ट्रक्टर के माध्यम से कॉल हो, न कि MyClass के माध्यम से (एक वर्चुअल बेस क्लास का कंस्ट्रक्टर उस क्लास द्वारा नहीं बुलाया जाता जो इससे इनहेरिट करती है, बल्कि कंक्रीट क्लास के कंस्ट्रक्टर द्वारा बुलाया जाता है)।

उदाहरण: फाइनल क्लास अनुकरण (C++11 से पहले)

#include <iostream>
using namespace std;

class MyClass; // फॉरवर्ड डिक्लेरेशन

class MakeFinalClass {
private:
    MakeFinalClass() {
        cout << "यह MakeFinalClass का कंस्ट्रक्टर है" << endl;
    }
    friend class MyClass;
};

class MyClass : virtual MakeFinalClass {
    // यह फाइनल क्लास होगी
public:
    MyClass() {
        cout << "यह फाइनल क्लास का कंस्ट्रक्टर है" << endl;
    }
};

// डेराइव्ड क्लास बनाने का प्रयास
class MyDerivedClass : public MyClass {
public:
    MyDerivedClass() {
        cout << "डेराइव्ड क्लास का कंस्ट्रक्टर" << endl;
    }
};

int main() {
    MyDerivedClass derived; // कंपाइल त्रुटि!
    return 0;
}

आउटपुट

In constructor 'MyDerivedClass::MyDerivedClass()':
[Error] 'MakeFinalClass::MakeFinalClass()' is private

MyDerivedClass का कंस्ट्रक्टर MakeFinalClass के प्राइवेट कंस्ट्रक्टर को कॉल करने का प्रयास करता है (क्योंकि यह वर्चुअल बेस है), लेकिन एक्सेस नहीं कर सकता क्योंकि यह फ्रेंड नहीं है।


MyClass के ऑब्जेक्ट बनाना (काम करता है)

int main() {
    MyClass obj; // OK: MyClass, MakeFinalClass का फ्रेंड है
    return 0;
}

आउटपुट

यह MakeFinalClass का कंस्ट्रक्टर है
यह फाइनल क्लास का कंस्ट्रक्टर है

आधुनिक C++ (C++11+): final कीवर्ड

C++11 से, final कीवर्ड मूल रूप से समर्थित है - वर्कअराउंड की आवश्यकता नहीं:

class MyClass final {
public:
    MyClass() { cout << "फाइनल क्लास\n"; }
};

// class MyDerived : public MyClass { }; // कंपाइल त्रुटि: final क्लास से इनहेरिट नहीं कर सकते

int main() {
    MyClass obj; // OK
    return 0;
}

final कीवर्ड के अन्य उपयोग

  • वर्चुअल फ़ंक्शन ओवरराइड रोकें:
    class Base {
          virtual void foo() final; // आगे ओवरराइड नहीं कर सकते
      };
      class Derived : public Base {
          // void foo() override; // त्रुटि: final वर्चुअल फ़ंक्शन
      };
  • क्लास इनहेरिटेंस रोकें:
    class MyClass final { ... };

तुलना

दृष्टिकोणC++ संस्करणजटिलतापठनीयता
वर्चुअल बेस + प्राइवेट कंस्ट्रक्टर + फ्रेंडC++98उच्चकम
final कीवर्ड (क्लास)C++11+कमउच्च
final कीवर्ड (वर्चुअल फ़ंक्शन)C++11+कमउच्च

सिफारिश: आधुनिक C++ (C++11 और बाद) में, सीधे final कीवर्ड का उपयोग करें। यह स्पष्ट, मानक और रखरखाव योग्य है।

  1. C++ में मल्टीपल इनहेरिटेंस C++ में मल्टीपल इनहेरिटेंस

    मल्टीपल इनहेरिटेंस तब होता है जब कोई क्लास एक से अधिक बेस क्लास से इनहेरिट करती है। इसलिए क्लास मल्टीपल इनहेरिटेंस का उपयोग करके कई बेस क्लासेज से सुविधाएं इनहेरिट कर सकती है। यह C++ जैसी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं की एक महत्वपूर्ण विशेषता है। मल्टीपल इनहेरिटेंस को प्रदर्शित करने वाला एक

  1. - C++ में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग कैसे शुरू करें?

    ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) एक प्रोग्रामिंग पैराडाइम है जो ऑब्जेक्ट्स की अवधारणा पर आधारित है, जिसमें डेटा एट्रिब्यूट्स के रूप में हो सकता है; और काम करने के निर्देश मेथड्स के रूप में हो सकते हैं। उदाहरण के लिए, एक व्यक्ति एक ऑब्जेक्ट है जिसमें कुछ प्रॉपर्टीज होती हैं जैसे ऊंचाई, लिंग, उम्

  1. - Python में क्लास इनहेरिटेंस कैसे काम करती है?

    क्लासेस में इनहेरिटेंस क्लास को नए सिरे से परिभाषित करने के बजाय, हम पैरेंट क्लास को नई क्लास के नाम के बाद पैरेंथेसिस में सूचीबद्ध करके पहले से मौजूद क्लास से इसे डेराइव करके एक क्लास बना सकते हैं। चाइल्ड क्लास अपने पैरेंट क्लास के एट्रिब्यूट्स इनहेरिट करती है, और हम उन एट्रिब्यूट्स का उपयोग कर सकत