클래스는 두개 이상의 클래스도 상속받을 수 있다.
하지만 동일한 클래스나 같은 기반 클래스를 공유하는 클래스들을 상속받으면 문제가 발생한다.

B와 C는 a라는 멤버를 가지는 A를 같은 기반 클래스로 가지고 있는데, D에서는 그럼 a라는 멤버를
B클래스의 것이라고 봐야할까? 아니면 C클래스의 것이라고 봐야할까?
이런 모호한 문제가 발생하기 때문에 사용하는 것이 가상기반(virtual) 클래스이다.
가상 기반 클래스는 간접적으로 두번 상속되어도 클래스에는 멤버를 한번만 상속시킨다.
class B : virtual public A
....
class C : virtual public A
....
class D : public B, public C
{
protected:
int d;
public:
D(int aa, int ab, int ac, int ad) : A(aa), B(aa,ab), C(aa,ac) { d=ad; }
}
위와같이 B,C 클래스의 기반클래스 A를 가상 기반 클래스로 지정한다. D생성자의 초기화 리스트에서 B의 생성자를 호출하는데 B의 생성자는 A의 생성자를 호출하지 않는다. 중간 단계의 클래스들(B,C)은 가상 기반 클래스 A의 멤버에 대한 초기화를 최종 클래스 D에게 맡긴다. 그래서 A(aa)를 추가해 A의 생성자를 통해 초기화 한다. A의 생성자가 없으면 디폴트 생성자를 호출하며 디폴트 생성자가 없으면 오류로 처리한다.
파생 클래스는 원래 바로 위 기반 클래스인 부모 클래스 생성자만 있지만 다중 상속의 경우 예외가 인정되어 할아버지 생성자도 호출할 수 있다. 그만큼 다중 상속이 복잡한 문제를 발생시킨다고도 말할 수 있다.
'C++' 카테고리의 다른 글
| [C++] 가상 함수, 가상 파괴자 (0) | 2022.01.05 |
|---|---|
| [C++] 포함, private 상속, public 상속 (0) | 2022.01.05 |
| [C++] 상속받은 멤버 초기화 (0) | 2022.01.05 |
| [C++] 복사 생성자 (0) | 2022.01.04 |
| [C++] 연산자 오버로딩 (0) | 2022.01.04 |