साथ एकाधिक वंशानुक्रमसी ++: बहुरूपता
(अग्रिम में noob सवाल क्षमा) मैं 4 वर्गों है:
class Person {};
class Student : public Person {};
class Employee : public Person {};
class StudentEmployee : public Student, public Employee {};
मूलतः Person
आधार वर्ग, जो सीधे Student
और Employee
दोनों द्वारा subclassed कर रहे हैं। StudentEmployee
Student
और Employee
दोनों को उपclass करने के लिए एकाधिक विरासत कार्यरत है।
Person pat = Person("Pat");
Student sam = Student("Sam");
Employee em = Employee("Emily");
StudentEmployee sen = StudentEmployee("Sienna");
Person ppl[3] = {pat, sam, em};
//compile time error: ambiguous base class
//Person ppl[4] = {pat, sam, em, sen};
जब मैं Person
की एक सरणी का उपयोग करें, आधार वर्ग, मैं Person
और उसके उपवर्गों के सभी इस सरणी के अंदर डाल सकते हैं। संदिग्ध आधार वर्ग के कारण दिए गए StudentEmployee
के अलावा।
यह देखते हुए कि StudentEmployee
Person
के सभी तरीकों और विशेषताओं की गारंटी है, StudentEmployee
व्यक्ति का उप-वर्ग माना जाता है?
- यदि ऐसा है, तो संकलक मुझे ऑब्जेक्ट को अपने सुपरक्लास के प्रकार के चर के लिए असाइन करने की अनुमति क्यों नहीं देता है?
- यदि नहीं, तो क्यों नहीं; और इसे पूरा करने का सही तरीका क्या होगा?
चीयर्स
संपादित करें: preemptively, इस प्रश्न का अनुसरण में से किसी एक नहीं है:
polymorphism relates inheritance
Inheritance mucking up polymorphism in C++?
लेकिन जाहिर है, इस तरह की नई कॉलिंग निश्चित रूप से स्लाइसिंग के लिए मेमोरी लीक – Falmarri
+1 की ओर ले जाएगी। और अगर बगुइज़ पहले से ही नहीं जानता था, तो यह व्यक्ति * पीपीएल [] = {और पेट, और सैम, और एम, &sen }; भी हो सकता है - इन दो विकल्पों के मेमोरी प्रबंधन में थोड़ा अंतर है। – Michael
@ फाल्मररी: क्यों? आपके पास अभी भी पॉइंटर्स की सरणी है। – Job