2016-08-24 11 views
5

एक आम आभासी आधार वर्ग के साथ दो वर्गों को देखते हुए:C++ आभासी विरासत अंतर

class Base {}; 

class Derived1 : public virtual Base {}; 

class Derived2 : public virtual Base {}; 

कि इन दो आगे व्युत्पन्न वर्ग के बीच कोई अंतर ?:

  • class Derived3 : public virtual Base, public Derived1, public Derived2 {}; 
    
  • class Derived3 : public Derived1, public Derived2 {}; 
    
है

पहला वर्चुअल बेस सी से सीधे प्राप्त होता है lass, लेकिन मुझे लगता है कि इसका कोई प्रभाव नहीं है, क्योंकि इसे Derived1 और Derived2 के साथ साझा किया गया है।

उत्तर

2

वे वही बात कहते हैं। केवल अंतर यह है कि यदि आपने Derived3 की दोनों परिभाषाओं से public Derived1 और public Derived2 हटा दिया है, तो पहले व्यक्ति को अभी भी Base से प्राप्त होगा और दूसरा नहीं होगा।

संपादित करें: मैंने इस बारे में सोचा नहीं है कि कुछ अजीब क्रॉस-कास्ट स्थिति है जहां दोनों अलग-अलग व्यवहार करेंगे, हालांकि मुझे नहीं लगता कि वहां है।

2

उन उदाहरणों के बीच कोई अंतर नहीं है।

लेकिन एक और जटिल परिदृश्य में, अन्यथा विरासत में प्राप्त वर्चुअल बेस को विरासत में प्राप्त करने से बेस क्लास सबोबजेक्ट्स के निर्माण/विनाश का क्रम बदल सकता है।

1

मुझे नहीं लगता कि ऑब्जेक्ट लेआउट में कोई अंतर है क्योंकि वर्चुअल विरासत का इरादा Base (या मामले में तीन प्रतियां) की दो प्रतियों से बचने के लिए है।

तो सभी अंतर आपके इरादे और कोड की वास्तव में पठनीयता में हैं।

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