본문 바로가기

Archived(CSE Programming)/cpp

Chap 9. 가상(Virtual)의 원리와 다중상속

Chap 9. 가상(Virtual)의 원리와 다중상속


9-1. 멤버함수와 가상함수의 동작원리


논리적으로는 객체 안에 멤버함수를 가지는 것이 타당하다.

이는, C 스타일의 해당 함수 포인터를 통해 특정 함수의 주소 공간을 각 객체에서 가르키고 있는 형태와 유사하다고 할 수 있다.

즉, 각 클래스의 내부에 함수 주소 공간을 가르키는 포인터 형이 있고 실제 함수의 공간을 따로 할당이 되어있는 것이다.


그리고 V-Table 이라고 하는, 가상함수 테이블(virtual table)을 통해 해당 클래스마다 호출할 수 있는 함수의 목록을 나열해둬서 우리가 가상함수를 통해 오버라이딩 하였을 경우, 상위 클래스의 동일 함수는 가려지고 하위 클래스의 동일 함수가 목록에 있어서 실제 객체에 따라 특정 함수가 호출되는 형태를 통해 오버라이딩이 진행되는 것이다.


9-2. 다중상속(Multiple Inheritance)에 대한 이해


다중상속은 득보다는 실이 많다는 입장이 대다수여서 C++의 기본 문법에서는 제하는 것이 보통이다.

구현 방법은 상속에다가 여러 개의 클래스를 나열하는 것으로 구현하면 되는 것이지만, 다이아몬드 상속과 같을 때, 최상위 클래스의 주소 공간이 최하위 클래스에서는 여러 개 존재할 수 있다는 문제점이 있다. 이 때는, 가상 상속이라는 virtual 키워드를 통해 해결할 수 있다.


결론적으로 다중상속은 쓰지 않는 것이 일반적인 의견이다.