Sdílet prostřednictvím


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

Graf dědičnosti s informacemi o základní třídy pro usnadnění přístupu

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.

Viz také

Referenční dokumentace

Převody ukazatele (C++)