अब, मुझे पता है कि गैर-पत्ते वर्गों में नए आभासी कार्यों को जोड़ने में आम तौर पर बुरा होता है क्योंकि यह किसी भी व्युत्पन्न कक्षाओं के लिए बाइनरी संगतता को तोड़ देता है जिसे पुन: संकलित नहीं किया गया है।शुद्ध वर्चुअल फ़ंक्शंस और बाइनरी संगतता
मैं उदाहरण के लिए, एक अंतरफलक वर्ग और कार्यान्वयन वर्ग किसी साझा लाइब्रेरी में संकलित किया है:: हालांकि, मैं एक अलग स्थिति है
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
...
}
class Impl {
public:
...
void Foo(uint16_t arg);
....
}
मेरा मुख्य आवेदन इस शेयर की गई लाइब्रेरी का उपयोग करता है, और मूल रूप से लिखा जा सकता है के रूप में:
Interface* foo = Implementation::giveMeImplPtr();
foo->Foo(0xff);
दूसरे शब्दों में, आवेदन किसी भी वर्ग है जो Interface
से निकाले जाते हैं नहीं है, यह केवल इसे इस्तेमाल करता है।
अब, कहते हैं कि मैं Foo(uint32_t arg)
साथ Foo(uint16_t arg)
ओवरलोड करना चाहते हैं, मुझे क्या करना सुरक्षित हूँ:
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
virtual void Foo(uint32_t arg) = 0;
...
}
और आवेदन पुनः संकलित किए बिना मेरी साझा लाइब्रेरी पुनः संकलित करें?
यदि हां, तो क्या कोई असामान्य चेतावनी है जिसके बारे में मुझे अवगत होना चाहिए? यदि नहीं, तो क्या मेरे पास हिट और अप-वर्जन लाइब्रेरी लेने के अलावा अन्य कोई विकल्प हैं, इस प्रकार पीछे की संगतता तोड़ रही है?