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

C++ में फाइनल क्लास का अनुकरण (Simulating Final Class)


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

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

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

उदाहरण: फाइनल क्लास अनुकरण

#include <iostream>
using namespace std;

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

class MakeFinalClass {
private:
    MakeFinalClass() {
        cout << "यह MakeFinalClass का कंस्ट्रक्टर है" << endl;
    }
    friend class MyClass; // केवल 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 कीवर्ड के अन्य उपयोग

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

class Derived : public Base {
    // void foo() override; // त्रुटि: final वर्चुअल फ़ंक्शन
};

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

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

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

  1. - C++ में लोकल क्लास (Local Class)

    लोकल क्लास क्या है? एक फ़ंक्शन के अंदर घोषित क्लास को लोकल क्लास कहते हैं क्योंकि यह उस फ़ंक्शन के लिए स्थानीय (local) होती है। बेसिक उदाहरण #include <iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } नियम और प्रतिबंध लोकल क्लास का नाम

  1. - Java में Final Class

    क्लास को final घोषित करने का मुख्य उद्देश्य क्लास को सबक्लास होने से रोकना है। यदि एक क्लास को final के रूप में चिह्नित किया जाता है तो कोई भी क्लास final क्लास से किसी भी सुविधा को इनहेरिट नहीं कर सकती।public final class Test { // body of class }