एक अभ्यास आप केवल आभासी विरासत का उपयोग करना चाहिए के रूप में वे आम तौर पर कई विरासत के साथ इस्तेमाल कर रहे हैं सुनिश्चित करने के लिए वर्ग के केवल एक संस्करण व्युत्पन्न वर्ग में मौजूद है कि इंटरफेस को परिभाषित करने के रूप में। और शुद्ध इंटरफेस एकाधिक विरासत का सबसे सुरक्षित रूप है। बेशक यदि आप जानते हैं कि आप क्या कर रहे हैं तो आप जितनी चाहें उतनी विरासत का उपयोग कर सकते हैं, लेकिन यदि आप सावधान नहीं हैं तो इसका परिणाम भंगुर कोड हो सकता है।
वर्चुअल विरासत के साथ सबसे बड़ी कमी यह है कि उनके निर्माता पैरामीटर लेते हैं। यदि आपको वर्चुअल बेस क्लास के कन्स्ट्रक्टर को पैरामीटर पास करना है तो आप सभी व्युत्पन्न कक्षाओं को कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करने के लिए मजबूर करते हैं (वे कन्स्ट्रक्टर को कॉल करने वाले बेस क्लास पर भरोसा नहीं कर सकते हैं)।
आपकी स्पष्ट सलाह के लिए मैं देख सकता हूं कि एकमात्र कारण यह है कि आपके वर्चुअल बेस क्लास में डेटा को इन्हें कन्स्ट्रक्टर पैरामीटर की आवश्यकता हो सकती है।
मार्टिन की टिप्पणी के बाद मैंने कुछ घर का काम किया, धन्यवाद मैरिन। पहली पंक्ति पूरी तरह सच नहीं है:
एक अभ्यास आप केवल आभासी विरासत का उपयोग करना चाहिए इंटरफेस को परिभाषित करने के रूप में वे आम तौर पर कई विरासत के साथ उपयोग किया जाता है सुनिश्चित करने के लिए वर्ग के केवल एक संस्करण मौजूद है कि के रूप में व्युत्पन्न कक्षा में। अगर आधार वर्ग एक शुद्ध इंटरफेस है
आभासी विरासत कोई फर्क नहीं पड़ता (थोड़ा अलग संकलक त्रुटियों के लिए छोड़कर, vc8 में, सभी तरीकों से लागू नहीं कर रहे हैं)। यह केवल इस मामले आप बल्कि एक यू से एक हीरे के साथ अंत में आकार
Non virtual virtual
A A A
| | / \
B C B C
\ / \ /
D D
आभासी मामले बी में अगर आधार वर्ग डेटा है एक असली फर्क नहीं पड़ता, और सी ए
का एक ही प्रति साझा
हालांकि मैं अभी भी शुद्ध इंटरफेस के बारे में अन्य सभी चीज़ों के साथ सहमत हूं, जो एकाधिक विरासत का सबसे सुरक्षित रूप है, भले ही उन्हें आभासी विरासत की आवश्यकता न हो। और तथ्य यह है कि कन्स्ट्रक्टर पैरामीटर और आभासी विरासत एक दर्द है।
आप सलाह के लिए एक लिंक या प्रशस्ति पत्र प्रदान किया जा सका मैं नहीं कर सकता।? बेस क्लास वर्चुअल को चिह्नित करने में बहुत अधिक बिंदु देखें यदि उसके पास डेटा सदस्य नहीं हैं, क्योंकि वर्चुअल विरासत का सबसे आम उद्देश्य बेस क्लास सदस्यों के डुप्लिकेशन को रोकना है। उदाहरण के लिए मानक पुस्तकालयों में, ios_base में डेटा सदस्य हैं, और यह एक हैआइसट्रीम और ओस्ट्रीम दोनों के वर्चुअल बेस क्लास (आईओएस के माध्यम से)। तो मैं लगभग (लेकिन काफी नहीं) रिवर्स कहूंगा - यदि आपके पास वर्चुअल बेस क्लास होगा, तो इसमें डेटा सदस्य होना चाहिए, या अन्यथा गैर-वर्चुअल रूप से प्राप्त होना चाहिए। –