가상 함수의 활용

Programming/C++ Language 2009. 9. 25. 23:29
활용 1.

class Rectangle

{
public:
virtual void Show() { ~ };
virtual void Hide() { ~ };
void Move() { Hide(); ~ ; Show(); };
}

class Circle : public Rectangle
{
public:
virtual void Show() { ~ };
virtual void Hide() { ~ };
}

void main()
{
Rectangle R;
Circle C;

R.Move();
C.Move();
}

이 때 결과는 어떻게 될까?
R 은 자신의 move 함수를 C 객체는 부모의 move 함수를 호출 하지만, move 내에 있는 Show와 Hide는 각자 자신의 Show와 Hide 함수를 호출한다. 왜 그럴까?
이유는 간단하다. 묵시적으로 this-> 가 함수앞에 생략 되어 있기 때문이다. this->Show(); this->Move() 같이 말이다. 그래서 R에서 Move를 호출할 때는 Rectangle 클래스에 있는 Show, Hide 함수가 호출 되고, C에서 Move를 호출 할 때는 Circle 클래스에 있는 Show, Hide 함수가 호출 된다.


활용 2.

장기적인 관점에 봤을 때, 재활용성이 높은 클래스를 만들 필요가 있다. 이를 위해서, 파생 클래스에서 재정의 할 수 있도록, 재정의할 함수는 가상 함수로 사용하도록 하자. 가령, Student Management 라는 클래스가 있고, 여기에 Add, Remove, Edit, Dump 라는 함수 가 있을 때, Dump 하는 방법을 다르게 구현 할 필요가 있을 수 있다. 그럴 때는 Student MAnagemnt 클래스를 상속 받아서, Dump를 virtual 로 재 정의 하여, 원하는 방식대로 dump 를 할 수 있다. 즉, 재활용 높은 클래스를 만들고자 할 경우, 앞으로 재정의 할 가능성이 있는 함수를 구현 할 때는 virtual 을 선언하여, 재정의 가능 하도록 구현을 하자.


활용 3.

가상 소멸자를 사용 할 필요가 있다. Parent 클래스, Child 클래스가 있을 경우 Child 는 Parent를 상속하는 클래스라고 하자. 이때, Parent 와 Child 의 생성자에서 자원을 할당 하고, 이를 소멸자에서 자원을 해제한다고 할 때, Parent 포인터를 사용하지 않는다면, 정상적으로 생성자 소멸자가 동작하여, 자원을 정상적으로 생성, 해제 할 수 있다. 하지만 Parent* pParent 를 사용하여 Child를 대입 했을 경우, Delete pParent 를 할 경우, 부모의 소멸자만 동작을 하게되고, Chlid 의 자원을 해제 못하게 되어 누수가 될 것이다. 이 때, 소멸자를 virtual 로 선언을 하게 되면, Child 의 소멸자가 호출되고, Parent의 소멸자가 호출되어 자원이 정상적으로 해제 될 것이다.

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

namespace  (0) 2010.03.19
연산자 오버로딩  (0) 2009.09.30
순수 가상 함수  (0) 2009.09.26
가상 함수에 대한 이해  (0) 2009.09.25
Static Member  (0) 2009.05.31

설정

트랙백

댓글