(perdono la domanda novellino in anticipo)C++: ereditarietà multipla con polimorfismo
Ho 4 classi:
class Person {};
class Student : public Person {};
class Employee : public Person {};
class StudentEmployee : public Student, public Employee {};
Essenzialmente Person
è la classe di base, che sono direttamente sottoclasse sia Student
e Employee
. StudentEmployee
utilizza l'ereditarietà multipla per sottoclasse sia Student
e Employee
.
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};
Quando uso un array di Person
, la classe di base, che può mettere Person
e tutte le sue sottoclassi all'interno di questa matrice. Tranne StudentEmployee
, data la ragione per la classe base ambigua.
Dato che StudentEmployee
è garantito per avere tutti i metodi e gli attributi di Person
, è StudentEmployee
considerato una sottoclasse di Persona?
- In tal caso, perché il compilatore non mi consente di assegnare un oggetto a una variabile del tipo della sua superclasse?
- In caso contrario, perché no; e quale sarebbe il modo corretto per realizzare questo?
Acclamazioni
EDIT: preventivamente, questa domanda non è lo stesso di uno dei seguenti:
polymorphism relates inheritance
Inheritance mucking up polymorphism in C++?
Ma, ovviamente, chiamare nuove del genere quasi certamente porterà a una perdita di memoria – Falmarri
+1 per l'affettamento. E nel caso in cui bguiz non lo sapesse già, potrebbe anche essere Person * ppl [] = {& pat, & sam, & em, &sen }; - c'è una leggera differenza nella gestione della memoria di queste due opzioni. – Michael
@Falmarri: perché? Hai ancora la serie di puntatori. – Job