Virtual Function 가상 함수
: C++ 에서 가상 함수는 파생 클래스에서 재정의할 것으로 기대되는 멤버 함수를 의미한다.
이러한 가상 함수는 자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정된다.
*Base 클래스에서 virtual 키워드를 사용해 가상 함수를 선언하면,
파생 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 된다.
내용 정리
1) 모든 상속의 관계에서는 베이스 클래스의 컨스트럭터가 가장 먼저 실행되고,
베이스 클래스의 디스트럭터가 가장 마지막에 실행되어야 한다.
2) Base class의 Destructor는 무조건 virtual public, 또는 protected로 선언되어야 한다.
3) C++ 에서 다이나믹 폴리모피즘을 만드는 방법은,
클래스 간에 상속을 정의해 준 후에 virtual 키워드를 통해서 다이나믹 함수를 만들어 주는 것이다
예제1)
베이스클래스 Animal 클래스를 만들고, Animal 클래스를 상속받는 Cat 클래스를 만든 후에
상속받은 Cat 오브젝트를 main함수에서 생성해보면,
(1) Base 클래스의 컨스트럭터,
(2) 그 후에 고양이 클래스의 컨스트럭터와 디스트럭터,
(3) 마지막으로 Base 클래스의 디스트럭터가 실행된 것을 확인할 수 있다.
모든 상속의 관계에서는 베이스 클래스의 컨스트럭터가 가장 먼저 실행되고,
베이스 클래스의 디스트럭터가 가장 마지막에 실행되어야 한다.
예제2)
: 힙 메모리에 Animal object를 만든 후 실행해보면
마찬가지로 animal Constructor 와 animal Destructor가 실행이 되는 것을 확인할 수 있다.
Cat object 또한 힙 위에 올려서 실행해보면,
마찬가지로 베이스 클래스의 컨스트럭터가 가장 먼저 실행되고
베이스 클래스의 디스트럭터가 가장 마지막에 실행되는 것을 확인할 수 있다.
상속을 사용하는 이유 중 하나가 Dynamic Polymorphism 다이너믹 폴리모피즘인데,
다음의 코드는 베이스 클래스의 형태를 갖는 포인터에 파생 클래스를 생성했다는 의미이다.
: 결국 힙 위에 고양이 오브젝트를 생성한 것이다.
그런데,
빌드 후 실행해보면 Base 클래스의 constructor, Cat 클래스의 constructor가 실행되었는데
고양이 클래스의 Destructor가 실행되지 않았다.
-> 이를 해결해 주기 위해서는 베이스 클래스의 Destructor를 살짝 바꿔줄 필요가 있다.
상속을 사용하는데 있어
Base class의 Destructor는 무조건 virtual public, 또는 protected로 선언되어야 한다.
-디스트럭터가 protected로 선언되면 Base클래스를 object로 만들지 않겠다는 의미이기 때문에,
그런 특성이 정말 필요할 때만 사용한다.
거의 모든 경우에는 Base 클래스의 Destructor를 virtual public으로 선언한다.
예제3) Dynamic Polymorphism
*상속을 받은 virtual 함수에는 앞에 virtual을 붙여주는 방법,
override를 뒤에 붙여주는 방법, final 키워드를 붙여주는 방법이 있는데,
일반적으로는 상속받은 함수를 재정의 할 때 override를 붙여주는 방법을 사용한다.
1을 써주게 되면 moew~,
1이 아니라면 Animal 이 출력된다.
지금까지 object를 생성할 때 어떤 object를 생성할 지 컴파일시간에 결정했다면,
이와 같이 상속과 virtual 키워드를 통해서 프로그램 런타임 과정 중에 어떤 object를 생성할지 결정할 수 있다는 것.
이를 dynamic 또는 runtime polymorphism이라고 한다.
예제3-1)
Animal을 상속받은 Dog 클래스를 만든 후에 "왈!" 짖게 만들고,
메인 함수에서는 Animal의 포인터를 저장하는 5개의 array를 만들어 보자.
(#include <array> 잊지 않고 해주기)
ranged base for loop를 사용했고,
그 값이 1이라면 고양이, 1이 아니라면 강아지를 생성하도록 만든 것이다.
다이나믹하게 고양이와 강아지를 생성해 준 것.
즉, C++ 이런 다이나믹 폴리모피즘을 만드는 방법은,
클래스 간에 상속을 정의해 준 후에 virtual 키워드를 통해서 다이나믹 함수를 만들어 주는 것이다.
'모던C++ > 상속관계 Inheritance' 카테고리의 다른 글
8. Dynamic Cast _C++ (0) | 2022.09.02 |
---|---|
7. Virtual Inheritance 가상 상속_C++ (0) | 2022.09.01 |
6. 다중 상속 multiple inheritance _ C++ (0) | 2022.09.01 |
5. Pure Virtual Function 순수 가상 함수_ C++ (0) | 2022.09.01 |
4. Virtual Table, Virtual Function _ C++ (0) | 2022.08.31 |
2. 접근 권한 키워드 - public, private, protected, 파생 클래스 _ C++ (0) | 2022.08.23 |
1. Inheritance 상속이란? _ C++ (0) | 2022.08.23 |