가상 함수 (Virtual)
기본 클래스의 포인터로 호출하더라도 파생 클래스에 재정의된 함수를 호출하도록 만들려면 기본 클래스의 멤버 함수를 가상 함수로 선언해야 한다.
- 기본 클래스를 상속받은 파생 클래스에 같은 함수가 있다면 파생 클래스의 함수는 무시되고 기본 클래스의 함수로 실행이 됩니다.
- 파생 클래스의 함수를 실행시키고 싶다면 virtual 키워드를 사용해야 합니다.
이전에 상속에서 예를 들었었던 Shape를 예로 들어 이어나가겠습니다.
Shape 클래스 선언부
- void Draw() const; 함수에 가상함수 키워드가 없는 이전의 예제입니다.
가상함수 키워드를 사용하지 않고 Draw 함수를 호출하게 되면 아래와 같은 결과가 나옵니다.
파생 클래스(Rectangle, Eclipse)의 Draw()함수가 실행되지 않고 기본 클래스(Shape)의 Draw()함수가 실행되는 것을 보실 수 있습니다.
Shape 클래스 선언부 virtual 추가
- void Draw() const; 함수에 가상함수 키워드(virtual)를 추가했습니다.
가상함수 키워드를 추가하게 되면 파생 클래스(Rectangle, Eclipse)의 Draw()함수가 실행됩니다.
기본 클래스의 포인터나 레퍼런스에 파생 클래스 객체를 가리킬 때, 가상 함수를 호출하면 파생 클래스에 재정의된 가상 함수가 호출됩니다.
- 서로 다른 클래스의 객체에 대해서 같은 함수를 호출했을 때 실제로 어떤 객체가 사용되는지에 따라서 호출 함수가 달라지는 것을 다형성(Polymorphism)이라고 합니다.
기본적인 가상함수에 대한 이야기는 여기서 마치고 다음 포스팅에는
동적 바인딩
가상 소멸자
가상 함수의 원리
에 대해 작성하도록 하겠습니다.
'Programming Language > C, C++' 카테고리의 다른 글
C++ 가상 함수 (virtual) - 가상 소멸자 (0) | 2014.11.07 |
---|---|
C++ 가상 함수 (virtual) - 동적 바인딩 (0) | 2014.11.07 |
C++ 상속 (0) | 2014.11.07 |
C++ Hash와 Map의 차이점 (0) | 2014.10.13 |
C++와 Java의 차이점 (0) | 2014.10.13 |