आईएसओ सी ++ मानक निर्दिष्ट करता है कि एक वर्ग के सभी आभासी तरीके जो शुद्ध-आभासी नहीं हैं, उन्हें परिभाषित किया जाना चाहिए।
सीधे शब्दों में नियम है:
यदि आपका व्युत्पन्न वर्ग बेस क्लास वर्चुअल विधि को ओवरडाइट करता है तो उसे एक परिभाषा भी प्रदान करनी चाहिए, यदि नहीं तो बेस क्लास को उस पद्धति की परिभाषा प्रदान करनी चाहिए।
आपके कोड उदाहरण में उपरोक्त नियम के अनुसार, virtual void bar();
बेस क्लास में एक परिभाषा की आवश्यकता है।
संदर्भ:
C ++ 03 मानक: 10.3 वर्चुअल फ़ंक्शंस [class.virtual]
एक वर्ग में घोषित एक आभासी कार्य को परिभाषित किया जाएगा, या उस कक्षा में शुद्ध (10.4) घोषित किया जाएगा, या दोनों; लेकिन कोई निदान की आवश्यकता नहीं है (3.2)।
तो या तो आपको फ़ंक्शन को शुद्ध आभासी बनाना चाहिए या इसके लिए एक परिभाषा प्रदान करनी चाहिए।
जीसीसी फैक doccuments यह रूप में अच्छी तरह:
आईएसओ सी ++ मानक निर्दिष्ट करता है कि एक वर्ग के सभी आभासी तरीके जो शुद्ध-आभासी नहीं हैं, को परिभाषित किया जाना चाहिए, लेकिन इस नियम के उल्लंघन के लिए किसी निदान की आवश्यकता नहीं है [class.virtual]/8
। इस धारणा के आधार पर, जीसीसी केवल अनुवाद इकाई में निहित रूप से परिभाषित निर्माणकर्ताओं, असाइनमेंट ऑपरेटर, विध्वंसक और एक वर्ग की आभासी तालिका का उत्सर्जन करेगा जो इसकी पहली ऐसी गैर-इनलाइन विधि को परिभाषित करता है।
इसलिए, यदि आप इस विशेष विधि को परिभाषित करने में विफल रहते हैं, तो लिंकर स्पष्ट रूप से असंबंधित प्रतीकों के लिए परिभाषाओं की कमी के बारे में शिकायत कर सकता है। दुर्भाग्य से, इस त्रुटि संदेश को सुधारने के लिए, लिंकर को बदलना आवश्यक हो सकता है, और यह हमेशा नहीं किया जा सकता है।
इसका समाधान यह सुनिश्चित करना है कि सभी वर्चुअल तरीके जो शुद्ध नहीं हैं, परिभाषित किए गए हैं। ध्यान दें कि एक विध्वंसक को परिभाषित किया जाना चाहिए, भले ही वह शुद्ध-आभासी घोषित हो [class.dtor]/7
।