클래스를 대상으로도 포인터 변수를 선언할 수 있다
이 때 포인터 변수는 해당 클래스의 객체를 가리킬 수 있다
근데 이 포인터 변수는 해당 클래스의 객체 뿐만이 아니라 그 클래스를 상속받는
유도클래스의 객체 또한 가리킬 수 있다
그러니까
기초클래스의 포인터를 가지고 기초클래스와 유도클래스의 객체 모두를 가리킬 수 있는 것이다
그런데
기초클래스의 포인터를 가지고는 기초클래스 내의 public 변수(혹은 함수)에만 접근할 수 있다
실제로 기초클래스의 포인터가 유도클래스 객체를 가리키고 있는 상황에도
기초클래스의 포인터를 가지고는 유도클래스 객체에 접근할수가 없다 ㅡ.ㅡ
왜냐하면
C++ 컴파일러는 기초클래스 형 포인터가 실제로 가리키고 있는것은 신경쓰지 않고
선언된 포인터 변수가 기초클래스 형의 포인터 라는 것에 집중하기 때문이다
즉 컴파일러는 기초클래스 형 포인터가 가리키고 있는게 기초클래스 객체가 될수도,
유도클래스 객체가 될수도 있기 때문에, 이 포인터 변수를 가지고 유도클래스 내의 함수를 호출하려
하면 '해당 함수가 기초클래스 내에 정의되어 있지 않습니다' 라는 에러를 띄워준다
( 함수오버라이딩을 이용해 동일한 함수가 기초클래스와 유도클래스에 정의되었을 때에는
기초클래스에 정의된 함수가 호출된다)
-------------------------------------------------------------------------
요약 :
1. 기초클래스 형 포인터를 가지고 기초클래스 객체 뿐만 아니라 유도클래스 객체도 가리킬 수 있다
2. 근데 기초클래스 형 포인터를 가지고는 기초클래스에 정의된 멤버에만 접근이 가능하다
3. 이를 위한 해결 : 가상 함수
가상함수를 사용하면 기초클래스 형 포인터가 실제로 가리키고 있는 객체에 따라 호출의 대상을 결정
할 수 있다
'C++ > 공개글' 카테고리의 다른 글
가상함수는 언제 사용하는가 (0) | 2013.01.26 |
---|---|
객체와 일반자료형의 반환과 참조 (0) | 2013.01.26 |
정의하지 않아도 자동으로 만들어지는 4가지 함수 (0) | 2013.01.25 |
상속 관계에서 함수 오버로딩을 할 때 주의할점 (0) | 2013.01.25 |
cout, cin, endl (0) | 2013.01.25 |