クラスへのポインターが基本クラスへのポインターに変換できる 2 種類の場合もあります。
解説
最初の例は指定した基本クラスにアクセスでき変換が明確である場合です。(あいまいな基本クラスの参照方法の詳細については 複数の基本クラス を参照してください)。
基本クラスにアクセスできるかどうかどうかは派生で使用される継承の種類によって異なります。継承を次の図に示すことを検討してください。
基本クラスのアクセシビリティの図の継承グラフ
.gif)
次の表は図で示す状況の基本クラスのアクセシビリティを示します。
基本クラスのアクセシビリティ
関数の型 |
派生 |
からの変換 可能な A* への B* か。 |
|---|---|---|
外部スコープのないクラス () 関数 |
Private |
X |
|
Protected |
X |
|
Public |
○ |
12 C のメンバー関数 (12 C の範囲内) |
Private |
○ |
|
Protected |
○ |
|
Public |
○ |
C のメンバー関数 (C の範囲内) |
Private |
X |
|
Protected |
○ |
|
Public |
○ |
クラスへのポインターが基本クラスへのポインターに変換できる 2 回目は明示的な型変換を使用する場合と似ています。(明示的な型に変換する方法の詳細については明示的な型変換を持つ式 を参照してください)。
このような変換の結果はそのオブジェクトへのポインター 「」基本クラスによって完全に記述されているオブジェクトの一部です。
次のコードは B が A から派生したクラス A 2および B を定義します。(継承の詳細については派生クラス を参照してください)。次にB 型の bObjectオブジェクトおよび 2 のポインター (pA と pB) オブジェクトを指す定義します。
// 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
}
pA ポインターは型 A * 意味 「 A 型のオブジェクトへのポインターとして」解釈できる場合したがって BComponent と BMemberFunc などの bObject ( のメンバー) は一意 B を入力するにはでアクセスの pA です。pA の割り当てはクラス A で定義されているオブジェクトの特性にのみ (メンバー関数とデータ アクセス)。