Sono confuso su Virtual Inheritance e Disheritance? Sono entrambi uguali?
Sono confuso su Virtual Inheritance e Disheritance? Sono entrambi uguali?
Eredità virtuale
L'ereditarietà virtuale è una tecnica per risolvere il problema del diamond of death che può sorgere quando tramite l'ereditarietà multipla è possibile ereditare più volte la stessa classe base.
Ad esempio, supponiamo di avere una classe Person
e due classi derivate di essa: Student
e Employee
. Ora puoi avere una classe StudentWorker
che eredita da Student
AND da Employee
. Quindi questa classe eredita il doppio della classe Person
. Ma in realtà dovrebbe esserci solo un Person
, con un nome univoco e la data di nascita, ecc ... È possibile ottenere questo con l'ereditarietà virtuale.
class Person {...};
class Student: public virtual Person {...};
class Employee: public virtual Person {...};
class StudentWorker: public Student, public Employee {...};
Disinheritance
L'idea della diseredità è sbarazzarsi di un membro ereditato . Il problema è che la diseredità violerebbe il principio di sostituzione di Liskov e interrompe le ipotesi di base sugli oggetti derivati. Questo è certamente il motivo per cui non è supportato dai moderni linguaggi OOP mainstream per quanto ne so (ad esempio Java ). ( sembra comunque esistere un brevetto per un'implementazione di runtime del concetto )
Esistono diverse strategie che possono aiutare a raggiungere il bisogno di fondo:
Alcuni affermano che il bisogno di diseredare è il sintomo di un difetto di progettazione. Alternative da considerare:
Somiglianze
Quindi in generale, e in assenza di una definizione autorevole del termine, la diseredità non ha nulla a che fare con l'ereditarietà virtuale.
Tuttavia, l'ereditarietà virtuale può essere in qualche modo analizzata come un modo per sbarazzarsi di più classi di base ridondanti. Quindi posso immaginare che in questo contesto molto specifico, alcune persone potrebbero considerarlo come una sorta di diseredità. Personalmente, penso che questa terminologia sarebbe abusiva qui, perché non si tratta di eliminare l'ereditarietà, ma di "factorizing" (in senso matematico) elementi base ridondanti in un elemento base comune.
Leggi altre domande sui tag object-oriented inheritance virtual-inheritance