2014-10-16 10 views
5

मैं सोच रहा था कि क्यों जावा कोड का यह टुकड़ा सी ++ में एक ही कोड से अलग उत्पादन उत्पन्न करता है।इन 2 कोडों के बीच अंतर?

A::Foo() 
B::Foo() 

जावा कोड है::

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    A(){ 
     this->Foo(); 
    } 
    virtual void Foo() 
    { 
     cout << "A::Foo()" << endl; 
    } 
}; 
class B : public A 
{ 
public: 
    B() 
    { 
     this->Foo(); 
    } 
    virtual void Foo() 
    { 
     cout << "B::Foo()" << endl; 
    } 
}; 
int main(int, char**) 
{ 
    B objB; 
    system("pause"); 
    return 0; 
} 

यह आउटपुट का उत्पादन

public class Testa { 
    public Testa() 
    { 
     this.Foo(); 
    } 
    public static void main(String[] args) 
    { 
     Testb b = new Testb(); 
    } 
    void Foo() 
    { 
     System.out.println("A"); 
    } 

} 
class Testb extends Testa { 
    public Testb() 
    { 
     this.Foo(); 
    } 
    @Override 
    void Foo() 
    { 
     System.out.println("B"); 
    } 
} 

इस कोड का उत्पादन केवल

B 
B 

क्यों है इस उत्पादन इस मामले में अलग-अलग ? पहले जावा Testa निर्माता शामिल किया गया था

+1

सी ++ में आपको कन्स्ट्रक्टर (या विनाशक) में आभासी कार्यों को कॉल नहीं करना चाहिए, मैं ज्यादा जावा नहीं करता, इसलिए मैं उस पर बात नहीं करूंगा। – Borgleader

+2

ध्यान दें कि सी ++ कोड में आप दोनों रचनाकारों से foo कॉल कर रहे हैं, जबकि जावा कोड में आप इसे केवल टेस्टब के निर्माता से ही बुला रहे हैं। – Eran

+0

ओह, क्षमा करें मैंने इसे गलत टाइप किया है, एक सेकंड ... –

उत्तर

5

अंतर निर्माण के दौरान बहुरूपता के संचालन में है। जावा में, वस्तु का गतिशील प्रकार तुरंत व्युत्पन्न वर्ग का होता है, जिससे आप सदस्य चर को सेट करने का मौका मिलने से पहले भी सदस्य फ़ंक्शन को कॉल करने की अनुमति देते हैं। ये गलत है।

सी ++ का एक अलग दृष्टिकोण है: जबकि कन्स्ट्रक्टर चलता है, ऑब्जेक्ट का प्रकार उस वर्ग में से एक माना जाता है जो कन्स्ट्रक्टर से संबंधित है। सदस्य कार्यों के लिए सभी कॉल को उस धारणा के अनुसार स्थिर रूप से हल किया जाता है। नतीजतन, A के निर्माता A::foo() पर कॉल करते हैं, जबकि B के निर्माता B::foo() पर कॉल करते हैं।

2

संपादित

मेरा उत्तर के पहले भाग दिया गया था।


जावा कोड में, आप एक Testa निर्माता अपनी सी ++ कोड में के रूप में परिभाषित नहीं है। यह बताता है कि जावा में केवल एक B मुद्रित क्यों है।

लेकिन भले ही तुमने किया था, कोड अधिक बराबर बनाने के लिए:

public Testa() 
{ 
    this.Foo(); 
} 

यह

B 
B 

क्योंकि जावा में बहुरूपता यहाँ तक कि जब विधि निर्माता से कहा जाता है काम करता है मुद्रित होगा। लेकिन ऐसा करने का कोई अच्छा विचार नहीं है, क्योंकि Testb ऑब्जेक्ट का बच्चा हिस्सा अभी भी अनियमित हो जाएगा जब Foo विधि Testb में कॉल की जाती है।

+0

जैसा ही ठीक है, आप मेरे दिमाग को पढ़ते हैं।तो यह इस तरह सी ++ में काम नहीं करता है? –

+0

@MattJones नहीं, यह नहीं है। –

+1

@ मैटजोन्स मैं सी ++ से अधिक जावा जानता हूं; मुझे नहीं पता क्यों सी ++ अलग-अलग व्यवहार करता है। लेकिन मैं सत्यापित कर सकता हूं कि यह सी ++ में 'ए :: फू()' और 'बी :: फू()' प्रिंट करता है। – rgettman

संबंधित मुद्दे