가상의 원리와 다중상속
1. 가상함수의 공유와 가상함수 테이블
- C++에서 클래스의 객체가 생성되면, 멤버변수는 객체 내에 존재하지만, 멤버함수는 메모리의 한 공간에 별도로 위치하고선, 이 함수가 정의된 클래스의 모든 객체가 이를 공유하는 형태를 취한다.
- 클래스에 가상함수가 포함되면, 가상함수 테이블이 생성되고, 이 테이블을 참조하여 호출될 함수가 결정된다. 이러한 과정 때문에 속의 저하가 생기지만 많은 이점 때문에 가상함수는 자주 사용된다.
- 즉, 한 개 이상의 가상함수 생성 시, 무조건 가상 함수 테이블이 생성되고, 이 가상함수 테이블은 모든 멤버함수를 포함한다.
2. 다중상속
- C++의 특이한 점 하나는, 다중상속을 지원한다는 점이다. 물론, 부정적인 의견이 강하기 때문에 간단한 예시를 통해 사용법만 알아보자.
Class StudentHandler : public Student, public Student_Parent
{
. . .
}
3. 가상상속
- 다중상속의 가장 큰 단점은, 다이아몬드 상속구조를 띌 수 있다는 점이다. 이는 메모리 낭비와 성능저하로 이어질 가능성이 매우크다.
- 가령 위 코드에서 만일 Student_parent가 Student의 상속받고 있다면, Student의 생성자가 2번 호출되는 문제가 생길 것이다.
- 이러한 상황을 방지하기 위해 존재하는 것이 바로 '가상상속'이다.
- 가상상속은 접근 제어자 앞에 virtual 키워드를 붙이는 것으로 사용 가능하다. 이를 이용하면, 별도의 포인터를 생성하여 virtual로 상속된 클래스는 메모리 구조에서 가장 아래로 위치하게 되어 작동이 가능하지만, 데이터의 크기가 커지며 성능 저하를 야기한다.