2009-10-10 7 views
6
void foobar(Base* base) 
{ 
    Derived* derived = dynamic_cast<Derived*>(base); // or static_cast 
    derived->blabla = 0xC0FFEE; 
    if (base->blabla == 0xC0FFEE) 
     ... 
} 

के साथ कंपाइलर्स पर सख्त एलियासिंग, "बेस" के लिए उपनाम "व्युत्पन्न" है?अपने व्युत्पन्न वर्ग को सख्त एलियासिंग नियमों को तोड़ने के लिए एक पॉइंटर के माध्यम से कक्षा ऑब्जेक्ट तक पहुंच जाएगा?

उत्तर

5

दो पॉइंटर्स अलियोजित होते हैं जब भी उनके माध्यम से उसी ऑब्जेक्ट को एक्सेस करना संभव होता है। मानक के अनुच्छेद 3.10/15 निर्दिष्ट करता है जब किसी ऑब्जेक्ट तक पहुंच मान्य होती है।

एक कार्यक्रम निम्नलिखित प्रकार व्यवहार अपरिभाषित है में से एक के अलावा अन्य के lvalue के माध्यम से एक वस्तु की संग्रहीत मूल्य तक पहुँचने के लिए प्रयास करता है:

  • वस्तु के गतिशील प्रकार,
  • ऑब्जेक्ट के गतिशील प्रकार का एक सीवी-योग्य संस्करण,
  • एक प्रकार जो ऑब्जेक्ट के गतिशील प्रकार से संबंधित हस्ताक्षरित या हस्ताक्षरित प्रकार है,
  • एक प्रकार जो हस्ताक्षरित या हस्ताक्षरित प्रकार correspon है गतिशील प्रकार गतिशील प्रकार के सीवी-योग्य संस्करण के लिए डिंग,
  • एक समेकित या यूनियन प्रकार जिसमें इसके सदस्यों के बीच उपरोक्त प्रकारों में से एक शामिल है ( रिकर्सिवली, उपसमूह या निहित संघ का सदस्य),
  • एक प्रकार जो ऑब्जेक्ट के गतिशील प्रकार (
  • एक char या unsigned char प्रकार का एक (संभवतः सीवी-योग्य) बेस क्लास प्रकार है।

आपके मामले में, *derived या तो है वस्तु के गतिशील प्रकार का एक एल-मूल्य या यह एक प्रकार है कि वस्तु के गतिशील प्रकार का एक आधार वर्ग प्रकार है की है। *base एक प्रकार का है जो वस्तु के गतिशील प्रकार का बेस क्लास प्रकार है।

इसलिए, आपको derived और base दोनों के माध्यम से ऑब्जेक्ट तक पहुंचने की अनुमति है, जिससे दो पॉइंटर्स एलियाड किए गए हैं।

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

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