클래스에 대 한 포인터
두 가지 경우에서 클래스에 대 한 포인터를 기본 클래스에 대 한 포인터 변환할 수 있습니다.
설명
첫 번째 경우 변환이 모호 하지 않은 경우 지정 된 기본 클래스에 액세스할 수 있습니다.(참조 하십시오 여러 기본 클래스 모호한 기본 클래스 참조에 대 한 자세한 내용은.)
기본 클래스에 액세스할 수 있는지 여부는 파생에 사용 되는 상속의 종류에 따라 달라 집니다.다음 그림의 설명의 상속을 고려해 야 합니다.
상속 그래프의 기본 클래스의 액세스 가능성에 대 한
다음 표에서 그림과 상황에 대 한 액세스 가능성은 기본 클래스를 보여 줍니다.
기본 클래스의 액세스 가능성
함수 유형 |
파생 |
변환 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.