본문 바로가기
Programming/C++ & STL

객체 포인터의 참조 관계

by 한 땀; 한 땀; 2021. 1. 15.

 

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

class B : public A
{
public:
	void B() { cout << "B" << endl; }
};

int main()
{
	A* a1 = new B();
	a1->B();
	B* b1 = a1;

	B* b2 = new B();
	A* a2 = b2;

	return 0;
}

 

위 문장에서 에러가 나는 문장은?

 

만약 쉽게 찾지 못했다면 상속에 대한 이해가 부족한 것으로 볼 수 있다.

 

상속이란?

 

기초(부모) 클래스가 유도(자식) 클래스에게 기능을 물려준다는 것.

 

위의 문장만 보면 아래와 같이 합리적인 의심을 할 수 있다.

 

"B class type의 포인터 변수가 가리키는 객체는 A class의 모든 기능을 가지고 있으니  A class type의 포인터 변수도 참조할 수 있어야 하는 거 아니야?"라고 말이다.

 

즉, B * b1 = a1; 이 기능적인 관계로 봤을 때 맞다고 볼 수 있지 않나? 라는 의심을 해볼 수 있다.

 

하지만 이는 클래스의 기능적인 관점으로 해석했기 때문에 이런 오류가 생긴 것이다. 상속은 객체지향적인 관점으로 바라보면서 추가로 단순히 재활용의 관점이 아닌 공통적인 규약을 정의한다는 관점으로 바라봐야 한다.

 

예를 들어 게임에서 모험가라는 케릭터가 만들어지면 전사, 마법사, 격투가 등으로 1차 직업이 나누어질 때, 모험가는 기초 클래스가 될 수 있고 사용할 수 있는 기능이 move, jump, attack이 있다고 한다면 2차 직업인 전사, 마법사, 격투가 등은 기초 클래스를 상속하는 유도 클래스가 될 수 있으며 추가 기능들을 보유하게 될 것이다.

 

이때 위 코드를 적용시키면 모험가(b1)  = 전사(a1)다. 라고 해석할 수 있는데 이는 성립하지 않는다는 걸 알 수 있다.

모험가는 전사도 마법사도 격투가도 될 수 있다. 하지만 역은 성립한다. 기본적으로 전사는 모험가이며, 마법사 또한 모험가, 격투가 또한 모험가가 된다. 

 

즉, 코드의 기능적 범위로 포함 관계를 그리면 코드의 해석이 불가능해지며 객체지향적으로 바라볼 수 없게 된다.

 

 

 

 

 

'Programming > C++ & STL' 카테고리의 다른 글

함수 어댑터(function adaptor)  (0) 2021.01.16
바인더(binder)  (0) 2021.01.16
C++ 로 만든 카드 짝 맞추기  (0) 2021.01.07

댓글