Sdílet prostřednictvím


Přetypování

Jazyk C++ udává, že je-li třída odvozena ze základní třídy obsahující virtuální funkce, lze ukazatel na typ této základní třídy použít k volání implementací virtuálních funkcí umístěných v objektu odvozené třídy. Třída obsahující virtuální funkce je někdy označována jako „polymorfní třída“.

Jelikož odvozená třída obsahuje všechny definice všech základních tříd, z nichž byla odvozena, lze ukazatel přetypovat na libovolnou z těchto tříd vyskytujících se výše v jejich hierarchii. Je-li dán ukazatel na základní třídu, může být bezpečné přetypovat ukazatel na třídu umístěnou v hierarchii níže. Přetypování je bezpečné, pokud objekt, na který ukazatel ukazuje, je ve skutečnosti typem odvozeným ze základní třídy. V tomto případě je skutečný objekt "úplným objektem". Ukazatel na základní třídu je označen tak, aby odkazoval na "podobjekt" kompletního objektu. Vezměte v úvahu například hierarchii tříd znázorněnou na následujícím obrázku.

Diagram of a class hierarchy where C derives from B, which derives from A.
Hierarchie tříd

Objekt typu C lze vizualizovat tak, jak ukazuje následující obrázek.

Diagram of Class C with subobjects B and A.
Třída C s dílčími objekty B a A

Je-li dána instance třídy C, existuje podobjekt B a podobjekt A. Instance třídy C, včetně podobjektů A a B, je „kompletním objektem“.

Pomocí informací o typu modulu runtime lze zkontrolovat, zda ukazatel skutečně ukazuje na kompletní objekt a lze jej bezpečně přetypovat tak, aby ukazoval na jiný objekt ve své hierarchii. Operátor dynamic_cast lze použít k provedení těchto typů přetypování. Operátor provádí za běhu také kontroly potřebné k zajištění bezpečnosti operace.

Pro převod nepolymorfních typů můžete použít operátor static_cast (toto téma vysvětluje rozdíl mezi statickými a dynamickými převody přetypování a kdy je vhodné použít každý z nich).

Tato část se zabývá následujícími tématy:

Viz také

Výrazy