2011-10-04 24 views
8

मुझे क्या लगता है कि गतिशील प्रकार का अर्थ new का उपयोग करके गतिशील रूप से आवंटित ऑब्जेक्ट का अर्थ है। निम्नलिखित मामले में, क्या आप p अंक गतिशील प्रकार या स्थिर प्रकार के ऑब्जेक्ट पर कहते हैं? मानक में, यह गतिशील प्रकार गतिशील वस्तु के बारे में नहीं कहता है।गतिशील प्रकार का ऑब्जेक्ट

1.3.3 - सबसे व्युत्पन्न वस्तु के प्रकार (1.8), जो lvalue एक lvalue अभिव्यक्ति संदर्भित द्वारा प्रदर्शित किया जाता है। [उदाहरण: यदि कोई सूचक (8.3.1) पी जिसका स्थैतिक प्रकार "कक्षा बी के सूचक" वर्ग डी की ऑब्जेक्ट को इंगित कर रहा है, बी (खंड 10) से प्राप्त, अभिव्यक्ति के गतिशील प्रकार * पी "डी" है संदर्भ (8.3.2) समान रूप से इलाज किया जाता है। ]

इसके अलावा क्या यह निम्नलिखित उद्धरण मतलब है

एक rvalue अभिव्यक्ति की गतिशील प्रकार के स्थिर प्रकार

class Base { 
    virtual void foo(){} 
}; 

class Derived : public Base { 
    void foo(){} 
}; 

int main() 
{ 
    Derived d; 
    Base *p = &d; 
} 

उत्तर

19

मैं क्या लगता है कि गतिशील प्रकार गतिशील वस्तु आवंटित करने का मतलब है नए का उपयोग कर रहा है।

नहीं।

गतिशील प्रकार किसी ऑब्जेक्ट का वास्तविक प्रकार है जिसे संदर्भ (पॉइंटर शामिल) के माध्यम से एक्सेस किया जा सकता है जो कि इसके वास्तविक प्रकार के मूल प्रकार को इंगित करता है।

है कि, अगर हमने:

class A { 

}; 

class B : public A { }; 


B l; 
A& k = l; 

यहाँ कश्मीर ग्रुप ए का एक उद्देश्य के लिए एक संदर्भ है, लेकिन संदर्भित किया वस्तु, इसके गतिशील प्रकार, की वास्तविक प्रकार बी

है यहां "गतिशील" का अर्थ है "केवल रन-टाइम पर जाना जाता है"।

+0

+1 साफ़, संक्षिप्त, अच्छा उदाहरण। – Lou

+3

+1, लेकिन मुझे लगता है कि आप उदाहरण को जोड़कर और भी स्पष्ट कर सकते हैं जो बिल्कुल नया उपयोग नहीं करता है। –

+0

'ए और के = बी();' पर्याप्त नहीं होगा? – arne

5

स्थिर प्रकार के प्रकार है परिवर्तनीय, जो संकलित समय पर ज्ञात एकमात्र प्रकार है (इसलिए स्थैतिक माना जाता है - बदल नहीं सकता है)। गतिशील प्रकार उस ऑब्जेक्ट का प्रकार है जिसे वास्तव में रन-टाइम पर इंगित किया जा रहा है। यहां गतिशील का अर्थ है कि यह केवल रन टाइम पर जाना जाता है, जिसका अर्थ है कि यह बदल सकता है (अर्थात् एक चर विभिन्न प्रकार की विभिन्न वस्तुओं पर इंगित कर सकता है)।

इस सामग्री में new का उपयोग प्रासंगिक नहीं है, जैसा कि आपका स्वयं का उदाहरण दिखाता है। आपके मुख्य में, d का स्थिर और गतिशील प्रकार Derived है, क्योंकि यह सूचक या संदर्भ नहीं है। p, हालांकि, Base का एक स्थिर प्रकार है, लेकिन आपके कोड में, गतिशील प्रकार Derived होगा।

3
जैसे C++ या जावा उदाहरण के लिए, static संकलन समय ज्ञात जानकारी का उल्लेख कर सकते हैं, जबकि dynamic कार्यावधि में ज्ञात जानकारी को दर्शाता है के रूप में

एक स्थिर टाइप किया भाषा में,।

उदाहरण के लिए:

struct Base { virtual std::string name() const { return "Base"; } }; 

struct Derived: Base { std::string name() const { return "Derived"; } }; 

void print(Base const& b) { std::cout << b.name() << "\n"; } 

print विधि में, b की static प्रकार Base const& है। इसलिए, संकलक जांच करेगा कि Base ऑब्जेक्ट के संदर्भ में सभी विधियों को मौजूद किया गया है।

हालांकि, जब निष्पादन आता है, name करने के लिए कॉल, के रूप में विधि आभासी है, वस्तु की dynamic प्रकार के संबंध में किया जाता है:

  • इस Base
  • हो सकता है इस Derived हो सकता है
  • इस Base से दूसरे व्युत्पन्न वर्ग हो सकता है कि हम अभी तक नहीं पता

इसलिए, निम्न उदाहरण में:

int main(int argc, char* argv[]) { 
    if (argc == 1) { 
    Base base; 
    print(); 
    } else { 
    Derived derived; 
    print(derived); 
    } 
}; 
  • base की static और dynamic प्रकार Base है और derivedDerived है।
  • print विधि में, b की static प्रकार Base (हमेशा)
  • है तर्क की संख्या के आधार पर, b की dynamic या तो Base या Derived

यह मान लेना एक मौजूदा गलती है वह polymorphism आवश्यक गतिशील स्मृति आवंटन पर आधारित है, लेकिन दो अवधारणाओं, जबकि ऑर्थोगोनल नहीं, कुछ स्थितियों में एक दूसरे के बिना इस्तेमाल किया जा सकता है।

-1

डायनामिक मेमोरी आवंटन हमेशा रन टाइम पर किया जाता है। इसे "नया" कीवर्ड का उपयोग करके हासिल किया जा सकता है। लेकिन आपकी समस्या में उल्लिखित एक और मामला है * पी = & डी जैसा कि आपने बेस क्लास फ़ंक्शन "वर्चुअल" बनाया है, यह कंपाइलर को "पी" के इलाज के लिए बताता है सामग्री नहीं और पॉइंटर के प्रकार से नहीं, जिस पर यह संबंधित है इसलिए यह डायनामिक मेमोरी आवंटन में से एक है क्योंकि संकलक कभी नहीं जानता कि आप किस क्लास ऑब्जेक्ट का पता रन टाइम पर स्टोर करने जा रहे हैं, यह केवल यह जानता है कि यह किस प्रकार का पॉइंटर है (यानी बेस क्लास पॉइंटर या व्युत्पन्न क्लास पॉइंटर)।

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