जावा या 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 कीवर्ड का उपयोग करें।