od existujících tříd objektů (tzv. rodičovských tříd) lze odvozovat nové třídy (tzv. dceřiné třídy)
potomek (dceřiná třída) dědí veškeré atributy (vlastnosti) i metody
potomku lze přidávat další atributy a metody anebo metody tzv. překrývat (v potomkovi lze definovat metodu se stejným názvem, jako má rodič, avšak může dělat něco jiného než v rodiči)
dědičnost s polymorfismem umožňují řešit velmi obecným způsobem celou řadu souvisejících úloh najednou
Příklad dědičnosti:
V jazyce UML se používá pro znázornění dědičnosti šipek, kde šipky směřují od nejnižšího objektu (např.NákladníAuto) k nejvyššímu (Auto), tedy naopak než to mám znázorněné na obrázcích, pro větší srozumitelnost.
Třída NákladníAuto je odvozena od třídy Auto, takže pokud vytvoříme instanci typu NákladníAuto, budeme moci manipulovat jak s metodami
zjistiNakladovyProstor
nastavNakladovyProstor
vejdeSeNaklad
Ale i s metodami předka, protože NákladníAuto je potomek Auta a některé metody jsou veřejné
nastavVáhu
nastavObjem
zjistiVáhu
zjistiObjem
Dědičnost používáme:
když potřebujeme přidat nové vlastnosti a nechceme měnit původní třídu
k odvození specializované třídy (např. pohyblivý objekt je ve hře speciálním případem obecného objektu)
Potomek
také nazývaný dceřiná třída
třída odvozená z jiné třídy děděním (někdy se také označuje jako subclass - podtřída)
obecně v OOP může mít potomek i více přímých předků
Předek
také nazývaný rodič
třída, z níž je děděním odvozena jiná třída
je předkem odvozené třídy (někdy se také označuje jako superclass - nadtřída)
předek může mít více přímých potomků.
Příklad špatné dědičnosti
Někteří programátoři - začátečníci se pokoušejí doslova „vecpat“ dědičnost všude kde mohou, to, že nějaký objekt může mít více předků, neznamená, že toho náležitě využiji v každé situaci, jako např.:
Toto by vedlo v nejlepším případě k chybové hlášce kompilátoru, ale může být i hůře. Chyba je v tom, že v případě, že vytvoříme objekt typu kočka, tak vytváříme zároveň i objekt Zvíře a zároveň i Savce, který je také potomkem Zvířete, takže bychom měli dva objekty Zvíře a jak by asi kompilátor zareagoval na to, kdybychom chtěli zavolat nějakou metodu, či atribut ze superpředka Zvířete?
Hierarchie tříd
strom odvozených tříd s jednou kořenovou třídou - předkem všech dalších tříd.