2014-09-08 6 views
5

से आभासी समारोह कॉलिंग मैं निम्नलिखित के व्यवहार के रूप में उत्सुक हूँ:सदस्य निर्माता

#include <iostream> 
#include <string> 
struct A; 
struct B { 
    std::string b; 
    B(A& a); 
}; 
struct A { 
    B member; 
    virtual std::string f() { return "Hello, World!"; } 
    A() : member(*this) {} 
}; 
B::B(A& a) : b(a.f()) {} 
int main() { 
    std::cout << A().member.b; 
} 

इस आवश्यक अपेक्षित परिणाम मुद्रित करने के लिए है? या यह अनिर्धारित व्यवहार है?

उत्तर

6

यह कानूनी है। §12.7 [class.cdtor]/p4:

सदस्य आभासी कार्यों (10.3) सहित काम करता है,, निर्माण या विनाश (12.6.2) के दौरान कहा जा सकता है। जब वर्चुअल फ़ंक्शन को किसी निर्माता या विनाशक से सीधे या परोक्ष रूप से कहा जाता है, जिसमें वर्ग के गैर-स्थैतिक डेटा सदस्यों के निर्माण या विनाश के दौरान, और ऑब्जेक्ट जिस पर कॉल लागू होता है वह वस्तु है (इसे कॉल करें x) निर्माण या विनाश के तहत, कन्स्ट्रक्टर या विनाशक वर्ग में अंतिम ओवरराइडर कहा जाता है और इसे अधिक व्युत्पन्न कक्षा में ओवरराइड नहीं किया जाता है। आभासी समारोह कॉल एक स्पष्ट वर्ग के सदस्य पहुँच (5.2.5) और वस्तु अभिव्यक्ति का उपयोग करता है x या उस वस्तु के आधार वर्ग subobjects के एक नहीं बल्कि x या इसके आधार वर्ग subobjects के एक की पूरी वस्तु को संदर्भित करता है, व्यवहार अपरिभाषित है।

यूबी केस यहां लागू नहीं होता है।

+0

मुझे यह अधिकार कभी नहीं मिला .. यह कैसे लागू नहीं होता है? 'ए.एफ()' एक्स की पूरी वस्तु को संदर्भित करना चाहिए। क्या मैं इसे गलत पढ़ रहा हूँ? –

+0

@ मार्को। यूबी केवल तभी होता है जब यह 'x' या उस ऑब्जेक्ट के बेस क्लास सबोबजेक्ट्स ** की पूरी ऑब्जेक्ट को संदर्भित करता है लेकिन 'x' या इसके बेस क्लास सबबजेक्ट्स में से एक नहीं **। इस मामले में, निर्माण के तहत प्रासंगिक वस्तु एक 'ए' है, और ऑब्जेक्ट अभिव्यक्ति निर्माण के तहत वस्तु को संदर्भित करती है, इसलिए व्यवहार अच्छी तरह परिभाषित है। –

+0

मेरी मदद करने के लिए धन्यवाद: 'किसी ऑब्जेक्ट जो किसी अन्य ऑब्जेक्ट का सबबोजेक्ट नहीं है उसे पूर्ण ऑब्जेक्ट कहा जाता है।', तो यहां एक पूर्ण वस्तु का जिक्र नहीं है? –

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