Ukazatelé na třídy
Existují dva případy, kdy lze ukazatel na třídu převést na ukazatele základní třídy.
Poznámky
První případ nastane, pokud je zadaná základní třída přístupná a převod je nejednoznačný. (Více informací o výskytu nejednoznačných odkazů na základní třídu naleznete v tématu Více základních tříd.)
Přístupnost základní třídy závisí na druhu použité dědičnosti v odvození.Uvažujme dědičnost znázorněnou na následujícím obrázku.
Graf dědičnosti ilustrace dostupnosti základní třídy
Následující tabulka ukazuje přístupnost základní třídy pro situaci, znázorněnou na obrázku.
Přístupnost základní třídy
Typ funkce |
Odvození |
Převod z B* na A* platný? |
---|---|---|
Externí (nikoli třída s rozsahem) funkce |
Soukromé |
Ne |
|
Chráněno |
Ne |
|
Veřejné |
Ano |
Členská funkce B (v oboru B) |
Soukromé |
Ano |
|
Chráněno |
Ano |
|
Veřejné |
Ano |
Členská funkce C (v oboru C) |
Soukromé |
Ne |
|
Chráněno |
Ano |
|
Veřejné |
Ano |
Druhý případ, kdy lze ukazatel na třídu převést na ukazatele na základní třídu, je při použití převodu explicitního typu. (Další informace o převodech explicitních typů naleznete v tématu Výrazy s převody explicitních typů.)
Výsledkem takového převodu je ukazatel na "podřízený objekt", část objektu, která je kompletně popsána základní třídou.
Následující kód definuje dvě třídy A a B, kde je B odvozen od A. (Další informace o dědičnosti naleznete v tématu Odvozené třídy.) Následně definuje bObject, objekt typu B a dva ukazatele (pA a pB), které odkazují na objekt.
// conve__pluslang_Pointers_to_Classes.cpp
// C2039 expected
class A
{
public:
int AComponent;
int AMemberFunc();
};
class B : public A
{
public:
int BComponent;
int BMemberFunc();
};
int main()
{
B bObject;
A *pA = &bObject;
B *pB = &bObject;
pA->AMemberFunc(); // OK in class A
pB->AMemberFunc(); // OK: inherited from class A
pA->BMemberFunc(); // Error: not in class A
}
Ukazatel pA je typu A *, který lze interpretovat ve smyslu "ukazatel na objekt typu A." Členové bObject(jako například BComponent a BMemberFunc) jsou jedineční vzhledem k typu B a proto nejsou dostupní prostřednictvím pA.Ukazatel pA umožňuje přístup pouze k charakteristikám (členské funkce a data) objektu, které jsou definovány ve třídě A.