2012-05-10 28 views
9

क्या स्टैंड-अलोन क्लास में सार्वजनिक गैर-वर्चुअल गैर-इनलाइन ओवरलोडेड विधियों के क्रम को बदलना एबीआई को तोड़ता है?स्टैंड-अलोन क्लास ब्रेक एबीआई में सार्वजनिक गैर वर्चुअल विधियों को पुन: व्यवस्थित करता है?

से पहले:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i, int n); 
    void doSomething(char c, int i); 
    // ... 
}; 

के बाद:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i); 
    void doSomething(char c, int i, int n); 
    // ... 
}; 

धन्यवाद!

+1

सिद्धांत में उत्तर इस बात पर निर्भर करता है कि आप किस प्लेटफॉर्म/टूलचैन का उपयोग कर रहे हैं - सी ++ कोई विशिष्ट एबीआई जरूरी नहीं है। – Flexo

+4

मेरे जैसे लोगों के लिए जो नहीं जानता था कि एबीआई का क्या अर्थ है: http://en.wikipedia.org/wiki/Application_binary_interface अब आप करते हैं! – Stormenet

उत्तर

8

फ़ंक्शंस उनके नाम और हस्ताक्षर से जुड़े होते हैं, न कि कक्षा में उनकी स्थिति से। तो नहीं, आप एबीआई तोड़ नहीं रहे हैं।

आभासी कार्य एक अलग मामला हैं क्योंकि वे एक vtable (आमतौर पर) में अपनी स्थिति से जुड़े हुए हैं। यदि आप ऑर्डर को परिभाषित करने वाले शीर्षलेख पर निर्भर करते हैं, तो यह एक समस्या नहीं होगी, लेकिन अगर कक्षा पुस्तकालय में मौजूद है तो यह चिंता का विषय हो सकता है।

+0

कम से कम: Itanium एबीआई में कोई मुद्दा नहीं :) –

+0

मुझे यकीन नहीं था। धन्यवाद! –

1

दो चीजें हैं जो एबीआई को तोड़ती हैं जब आप अपनी कक्षाएं अपडेट करते हैं। मार्क द्वारा इंगित किए गए वर्चुअल फ़ंक्शंस (और याद रखें कि ऐसा इसलिए नहीं है क्योंकि आपने वर्क को वर्चुअल के रूप में चिह्नित नहीं किया है।)

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

+2

चूंकि प्रश्न में पुनर्मूल्यांकन सदस्य चर का उल्लेख नहीं किया गया था, इसलिए मैंने इसे अपने उत्तर में नहीं देखा, बहुत अच्छा मुद्दा! उन्हें सार्वजनिक भी होना जरूरी नहीं है। इसके अलावा मैं आपके अनुस्मारक की सराहना करता हूं कि आधार वर्ग एक वर्चुअल वर्चुअल बना सकता है, भले ही इसे व्युत्पन्न कक्षा में घोषित न किया जाए। –