यहां हम देखेंगे कि 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 कीवर्ड का उपयोग करें। यह स्पष्ट, मानक और रखरखाव योग्य है।