class ABC
{
생략
};
class DEF : public ABC
{
void DEFtest(void);
{
생략
}
};
int main(void)
{
ABC * ABCptr = new DEF(); //컴파일 성공!!
ABCptr->DEFtest(); //컴파일 에러!!
return 0;
}
ABCptr->DEFtest(); 에서 "ABCptr에 저장된 값은 DEF 객체의 값인데 왜 이 연산이 되지 않지?" 라고 생각할 수 있다. 그런데 이것은 사람의 생각일 뿐 컴파일러의 생각이 아니다.
C++ 컴파일러는 포인터 연산의 가능성 여부를 판단 할 때, 가리키고 있는 객체의 자료형으로 판단하지 않고, 포인터의 자료형으로 판단한다.
컴파일러는 ABC * ABCptr = new DEF(); 에서 DEF는 ABC를 상속하는 유도 클래스 이기때문에 이러한 문장을 허용한다.
하지만 ABCptr->DEFtest(); 에서는 ABCptr이 가리키는 대상이 DEF라는 사실을 기억하지 않는다.
대신 ABCptr은 ABC형 포인터이다 즉 ABCptr이 가리키는 대상이 ABC객체 일 수 도 있다 이렇게 생각하기 때문에 컴파일을 허용하지 않는 것 이다.
이러한 이유 때문에 아래의 내용 역시 허용하지 않는다!
int main(void)
{
ABC * ABCptr = new DEF(); //컴파일 성공!!
DEF * DEFptr = ABCptr; //컴파일 에러!!
return 0;
}
'열혈C++프로그래밍 > 개념' 카테고리의 다른 글
private, protected, public 선언의 기준 (0) | 2018.12.13 |
---|---|
C++ new/delete malloc/free 의 차이점 (0) | 2018.12.13 |