C++ और Java में इनहेरिटेंस की अवधारणा है। इनहेरिटेंस गुणों का उपयोग कोड को पुन: उपयोग करने और दो ऑब्जेक्ट्स के बीच संबंध बनाने के लिए किया जाता है। यहां हम C++ में इनहेरिटेंस और Java में इनहेरिटेंस के बीच कुछ बुनियादी अंतर देखेंगे।
1. ऑब्जेक्ट क्लास रूट
Java में: सभी क्लासेस Object क्लास को एक्सटेंड करती हैं। इसलिए क्लासेस का हमेशा एक सिंगल इनहेरिटेंस ट्री होता है। Object क्लास ट्री की रूट पर मौजूद है।
// Java
public class MyClass { }
public class Test {
public static void main(String[] args) {
MyClass obj = new MyClass();
System.out.println("obj Object का इंस्टेंस है: " + (obj instanceof Object)); // true
}
}
C++ में: कोई सार्वभौमिक बेस क्लास नहीं है। क्लासेस स्वतंत्र हैं जब तक कि स्पष्ट रूप से इनहेरिट न किया जाए।
2. ग्रैंडपैरेंट मेंबर्स तक पहुंच
Java में: ग्रैंडपैरेंट क्लासेस के मेंबर्स को सीधे एक्सेस नहीं किया जा सकता।
C++ में: :: स्कोप रिज़ॉल्यूशन ऑपरेटर का उपयोग करके एक्सेस किया जा सकता है (यदि एक्सेस स्पेसिफायर अनुमति देता है)।
3. प्रोटेक्टेड विजिबिलिटी
Java में: बेस क्लास के प्रोटेक्टेड मेंबर्स उसी पैकेज की किसी अन्य क्लास से एक्सेसिबल हैं, भले ही वह क्लास बेस क्लास से डेराइव्ड न हो।
// Java - MyClass.java
public class MyClass {
protected int x = 10;
protected int y = 20;
}
// Java - Test.java (उसी पैकेज में, डेराइव्ड नहीं)
public class Test {
public static void main(String[] args) {
MyClass obj = new MyClass();
System.out.println("x: " + obj.x + " y: " + obj.y); // एक्सेसिबल!
}
}
C++ में: प्रोटेक्टेड मेंबर्स केवल डेराइव्ड क्लासेज और फ्रेंड्स द्वारा एक्सेसिबल हैं, पैकेज अवधारणा नहीं है।
4. इनहेरिटेंस कीवर्ड और विजिबिलिटी
- Java:
extendsकीवर्ड का उपयोग करता है। इनहेरिटेंस की विजिबिलिटी नहीं बदल सकते - पब्लिक/प्रोटेक्टेड मेंबर्स डेराइव्ड में पब्लिक/प्रोटेक्टेड रहते हैं। - C++:
public,protected,privateइनहेरिटेंस निर्दिष्ट कर सकते हैं। यह बेस क्लास मेंबर्स की विजिबिलिटी को डेराइव्ड क्लास में प्रभावित करता है।
// C++
class Derived : public Base { // पब्लिक इनहेरिटेंस
class Derived : protected Base { // प्रोटेक्टेड इनहेरिटेंस
class Derived : private Base { // प्राइवेट इनहेरिटेंस
class Derived : Base { // डिफ़ॉल्ट: प्राइवेट (क्लास), पब्लिक (स्ट्रक्चर)
5. वर्चुअल मेथड्स
- Java: सभी नॉन-स्टेटिक, नॉन-फाइनल, नॉन-प्राइवेट मेथड्स डिफ़ॉल्ट रूप से वर्चुअल हैं।
- C++: वर्चुअल व्यवहार के लिए स्पष्ट रूप से
virtualकीवर्ड निर्दिष्ट करना होगा।
6. मल्टीपल इनहेरिटेंस
- C++: डायरेक्ट मल्टीपल इनहेरिटेंस समर्थित है (डायमंड प्रॉब्लम संभव, वर्चुअल इनहेरिटेंस से हल)।
- Java: क्लासेज के साथ डायरेक्ट मल्टीपल इनहेरिटेंस समर्थित नहीं।
interfaceका उपयोग करके मल्टीपल इनहेरिटेंस का प्रभाव प्राप्त करें। इंटरफेसेस प्योरली एब्स्ट्रैक्ट बेस क्लास हैं जहां कोई फ़ंक्शन पूरा नहीं होता, इसलिए कोई अस्पष्टता नहीं होती।
// Java
interface A { void methodA(); }
interface B { void methodB(); }
class MyClass implements A, B { // मल्टीपल इंटरफेस इनहेरिटेंस
public void methodA() { ... }
public void methodB() { ... }
}
सारांश तालिका
| पहलू | C++ | Java |
|---|---|---|
| रूट क्लास | कोई नहीं | java.lang.Object |
| इनहेरिटेंस कीवर्ड | कोई नहीं (कोलन सिंटैक्स) | extends |
| इनहेरिटेंस विजिबिलिटी | public/protected/private | हमेशा पब्लिक (इफेक्टिवली) |
| डिफ़ॉल्ट वर्चुअल | नहीं (explicit virtual) | हां (नॉन-फाइनल मेथड्स) |
| मल्टीपल इनहेरिटेंस | हां (क्लासेस) | नहीं (केवल इंटरफेसेस) |
| पैकेज/नेमस्पेस प्रभाव | नहीं | प्रोटेक्टेड एक्सेस पर प्रभाव |
| कंस्ट्रक्टर चेनिंग | इनिशियलाइज़र लिस्ट | super() कॉल |