본문 바로가기
C++

상속된 객체와 포인터의 관계

by 상레알 2009. 2. 3.
1] 객체 포인터: 객체의 주소 값을 저장할 수 있는 포인터

포인터란 메모리 공간의 주소 값을 저장할 수 있는 이름을 지니는 변수이다. int형 포이너는 int형 변수의 주소 값을 저장할 수 있으며, double형 포인터는 double형 변수의 주소 값을 저장할 수 있다. 그렇다면 객체 포인터는 AAA클래스의 포인터 (AAA*)는 AAA 객체의 주소 값 뿐만 아니라. "AAA클래스를 상속하는 Derived 클래스 객체 주소 값"도 저장이 가능하다.

AAA클래스의 포인터(AAA*)는 ~도 저장이가능하다  -> 를 통해서 객체 포인터를 이해하는 것보다. IS-A관계에 의해서 객체 포인터를 이해하는 것이 보다 좋은 공부 방법이라고한다.
객체지향은 현실 세계를 모델링해서 탄생된 개념이기 떄문에 이러한 접근방식이 더 정확한 이해를 돕는다고 한다.


+_+

객체 포인터의 권한 -
"AAA클래스의 객체 포인터는 가리키는 대상이 어떠한 객체이건, AAA클래스 타입 내에 선언도니 멤버와 AAA 클래스가 상속한 클래스의 멤버에만 접근이 가능하다"


-가정-

Person (Base 클래스) // ParTimestd는 Student클래스를 상속 // Student 클래스는 Person클래스를 상속 으로 가정.-
Person* P3= new PartTimeStd;  선언을 햇을시...  PartTimestd // Person클래스의 멤버함수 호출 불가능

-Person 타입의 포인터(Person *)가 가리키는 대상은 컴파일러 입장에서 Person 객체로 보인다. 대상이 PartTimestd 객체잉ㅁ을 알고 있지만 컴파일러는 이를 알지 못하기 때문에 이러한 현상이 발생하는것이다. 이에 대해서 상당히 불합리하고 불편하게 느낄수 있으나. 그러나 이는 잘못된 생각이다. 이러한 문법의 구성은 프로그래머를 위한 것이라고한다..-

문제 ]  

class Person{
public:
void sleep(){
cout<<"sleep"<<endl;
}
};

class student : public person
{
public:
void study(){
cout<<"study"<<endl;
}
};

class partTimeStd :public student
{
public:
void work(){
cout<<"work"<<endl;
}
};


int main(void)
{
student* p2 = new PartTimeStd;

p2->sleep();
p2->study();
p2->work();

return 0;
}
}

컴파일 시 오류의 원인이 되는 문장을 찾고 그 이유를 설명해 보자.

[p2->work();   이부분이 오류난다 왜냐하면 work는 student의 멤버함수가 아니다.!!!]

'C++' 카테고리의 다른 글

연산자 오버로딩  (0) 2009.02.06
클래스 멤버함수는 // virtual의 원리 // 다중상속 * 다시 봐야될듯.ㅠ  (0) 2009.02.05
순수(pure) 가상함수와 추상(abstract)클래스  (0) 2009.02.04
Static Binding & Dynamic Binding  (0) 2009.02.03
상속된 객체와 참조의 관계  (0) 2009.02.03
상속의 조건  (0) 2009.01.19
클래스...  (0) 2009.01.16
상속을 하는 이유  (0) 2009.01.16
protected 멤버  (0) 2009.01.15
상속!!  (0) 2009.01.15