# 가상 함수(Virtual Method)

껍데기만 선언하고, 알맹이! 구현은 하위 클래스에 맡기는 것!

다형성을 위한 것!

 

# 추상 클래스(Virtual Class)

가상 함수(순수 가상 함수)를 하나 이상 포함하고 있는 클래스!

인스턴스 생성 불가!

 

# 가상 함수 및 추상 클래스 사용 예제 [c++] 

[깨알같은 상황극] 

서점을 운영하는데, 도매로 책을 사와서 소매로 책을 판매한다.

그런데, 사장은 직원에게 책 분류 명령을 내려야하는데!

책 종류에 따라 분류 되어져야하는 특성상 소설책으로 분류해! 에세이로 분류해! 번거롭게 명령내려야하면 사장은 눈물남ㅠㅠ 무엇보다, 판타지, 잡지, 시, 만화 등...책 종류가 늘어날 수록 사장은 번거로워진다.

이런 상황을 방지할 수 있는것이 추상 클래스를 이용하는 것 이다. (인터페이스 개념 및 비교는 다음 포스팅에!) 사장은 그저 책을 분류하라는 명령만 내리면 되는 것이다!

 

[코드 설명] 

책이라는 추상 클래스를 상속받은 소설 클래스와 에세이 클래스!

분류()라는 가상 메소드를 에세이 클래스와 소설 클래스에서 각각 다르게 구현!

 

[실행 결과]

 

  

 

 

# 가상 함수 및 추상클래스 사용하지 않은 경우

[설명]

책 종류가 늘어나면 상당히 번거로워진다. ㅠㅠ

 

 

# 궁금한 것 !

- 가상 소멸자를 이용한 이유!

: 가상 소멸자를용하는 것은 의무는 아니지만, 소멸자 사용을 원한다면! 가상 함수를 이용하는 경우에는 소멸자도 가상이어야 한다. 파생된 객체에 대한 포인터가 삭제되는 경우 문제가 발생 할 수 있기 때문이다. 문제의 상황은 다음과 같다.

 

 

 

 

 

 

추상클래스의 소멸자만 호출되는 상황 발생! 흐름상 말도안된다ㅠ_ㅠ 따라서, 클래스에 가상 함수가 있다면 소멸자도 가상이어야 한다!

 

-추상클래스의 인스턴스를 생성할 수도 있을까?

 

 

 처음에 설명했던대로, 추상 클래스의 인스턴스는 생성할 수 없다!

 

-추상 클래스의 가상 함수는 두 개인데, 파생된 클래스에서 그중에 일부를 재정의 하지 않는 경우는 어떻게 될까?

 

결과는 다음과 같다.

 

 

에러가 발생하게 되는데, 애초에 추상 메소드를 정의하여, 추상 클래스를 만드는 것은 해당 메소드를 하위단에서 재정의 해주는 것을 원하기 때문에 당연한 결과라고 할 수 있다. 즉, 개발자 A가 만든 추상 클래스를 사용하는 개발자 B가 실수로 일부를 재정의 하지 않는 경우는 에러가 하므로 개발자A의 의도가 전달된다고 할 수 있다.

 

-추상 클래스의  멤버 함수를 가상(Virtual)으로 만들었으면, 파생 클래스에서도 가상으로 선언해서 구현해야하는가?

아니다 굳이 virtual을 붙여주지 않아도 내부적으로는 자동으로 가상 함수로 처리된다. 그러나 코드를 이해하기 쉽게, 알아보기 쉽게 붙여주는 것이 좋을 것 같다.

Posted by miniature88
,