類別的指標
有兩種情況中變數的指標,類別可以轉換成基底類別的指標。
備註
如為前者,指定的基底類別是可存取,並轉換模稜兩可。 (請參閱多個基底類別如需有關模稜兩可的基底類別參考。)
是否可存取基底類別,則用於衍生的繼承類型而定。 請考慮下圖所示的繼承。
基底類別的存取範圍的圖例的繼承圖形
下表顯示基底類別存取範圍,如圖所示的情況。
基底類別可及性
函式型別 |
衍生 |
從轉換 B *,A * 修正? |
---|---|---|
外部 (不類別範圍) 的函式 |
Private |
否 |
|
Protected |
否 |
|
Public |
是 |
B ¦ B 的範圍) 的成員函式 |
Private |
是 |
|
Protected |
是 |
|
Public |
是 |
(在 c 的範圍) 的 c 的成員函式 |
Private |
否 |
|
Protected |
是 |
|
Public |
是 |
第二句中變數的指標,類別可以轉換成基底類別指標是當您使用明確型別轉換。 (請參閱有明確的型別轉換運算式如需有關明確的型別轉換。)
這類轉換的結果是物件的變數的指標,子 」 物件,"完全由基底類別所描述部分。
下列程式碼會定義兩個類別, A和B,其中B衍生自A。 (如需有關繼承的詳細資訊,請參閱衍生的類別。) 然後定義bObject,型別的物件B,以及兩個指標 (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。" 成員的bObject(如BComponent和BMemberFunc) 都是唯一可以在此輸入B ,因此無法存取,透過pA。 pA指標只允許存取這些特性 (成員函式和資料) 之物件的類別中定義的A。