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;

}



+ Recent posts