(C++) 가상 함수

공부/C/C++2014. 3. 26. 22:44

출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/6


이번에는 가상 함수에 대해 설명합니다. 가상 함수는 기본 클래스에 정의된 함수를 재정의 한 함수입니다. 즉 같은 이름의 함수라는 것입니다. 전회, 같은 이름의 함수를 정의하면 받는 포인터의 형식에 따라간다고 말했습니다만, 가상 함수로 만들어버리면 파생 클래스 작성시의 포인터를 기본 클래스의 포인터로 받은 경우에도 제대로 파생 클래스 측의 함수가 실행되게 됩니다.

우선 코드를 봐주세요.



//기본 클래스 TEST class TEST{ public: virtual void output(){ printf("TEST 클래스입니다. \n"); } }; //파생 클래스 SUPER class SUPER : public TEST{ public: void output(){ printf("SUPER 클래스입니다. \n"); } }; int main(void) { //파생 클래스 SUPER 포인터를 선언 TEST *test[2]; //ne를 사용해 동적 확보 test[0]=new TEST; test[1]=new SUPER; test[0]->output(); test[1]->output(); delete test[0]; delete test[1]; return 0; }



결과물은 아래와 같습니다.



코드를 보면 알 수 있듯이, 기본 클래스와 파생 클래스는 output이라는 같은 이름의 함수가 정의되어 있습니다. 그리고 기본 클래스의 함수 앞에 vitual라고 쓰여져 있습니다. 이것이 함수는 가상 함수 앞에 virtual이라고 쓰여있습니다. 이것이 이 함수는 가상 함수입니다, 라고 명시하는 것입니다.

그리고 main 함수를 보세요. TEST 클래스의 포인터를 배열로써 두 개 선언했지요? 그리고, 첫 번째 요소에 TEST 클래스의 인스턴스 포인터를 두 번째 요소에 SUPER 클래스의 인스턴스 포인터를 각각 할당하게 합니다.  가상 함수가 아닌 경우는 받는 포인터의 클래스에 따라 함수가 실행되고 있었습니다만, 이번은 다릅니다. 각 output 함수가 두 번째는 SUPER 클래스의 output 함수가실행되고 있는 것을 알 수 있죠? 이것이 가상함수의 구조입니다. 어떤 때에 사용하는 것인지 잘 모르는 사람도 많을 거라고 생각합니다. 저도 거의 사용한 적이 없구요. 단지 알고있는 것만으로도, 기본 클래스의 포인터만으로 각 파생 클래스 처리를 정리하여 흘릴 것입니다. 예를 들어, 이 기본 클래스를 바탕으로 많은 파생 클래스를 만들어야 한다면 어떻게 될까요?
만약 같은 이름의 함수를 함께 실행하고자 할 때, 각 클래스의 포인터를 선언하고 있으면 귀찮고, 코드 가독성도 떨어집니다. 그럴 때 가상 함수를 사용한다면 함꼐 관리할 수 있으므로 편리합니다. 만약 그런 상황이 발생하면 일단 가상 함수를 사용하여 보는 것은어떨까요?

다음은 C++ 문자열 출력에 대해 설명합니다.


'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 클래스의 상속  (0) 2014.03.26
(C++) 클래스의 생성자와 소멸자  (0) 2014.03.26