다중 상속이란 하나의 Derived 클래스가 둘 이상의 Base 클래스를 상속하는 것을 말한다.
다음과 같이 콤마 연산자로 사용할 수 있다.
1 | class CCC : public AAA, public BBB |
|
다중 상속은 유용한 문법이 아니다. 클래스의 관계를 복잡하게 만들기 때문에 사용하지 않는 것이 좋다.
아래는 다중 상속을 사용할 때 발생할 수 있는 문제점이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class AAA { public: void func() { cout << "AAA" << endl; } }; class BBB { public: void func() { cout << "BBB" << endl; } }; class CCC : public AAA, public BBB { public: void print() { func(); // error } };
|
|
위 예제는 다중 상속을 사용했을 때 발생할수 있는 에러이다.
CCC 클래스는 AAA 클래스와 BBB 클래스를 상속하였는데 두 클래스에 같은 이름의 멤버 함수가 있다면 이처럼 모호성이 발생한다.
컴파일러는 func 함수가 AAA 클래스에 있는 것을 말하는 건지 BBB 클래스에 있는 것을 말하는 건지 모호하여 에러를 출력하였는데, 이는 AAA::func() 혹은 BBB::func() 이런 식으로 클래스를 알려주면 컴파일이 가능하다.
다음은 또다른 문제점 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class AAA { public: void func1() { cout << "AAA" << endl; } }; class BBB : public AAA { public: void func2() { cout << "BBB" << endl; } }; class CCC : public AAA { public: void func3() { cout << "CCC" << endl; } }; class DDD : public BBB, public CCC { public: void print() { func1(); // error } };
|
|
BBB 클래스와 CCC 클래스 둘다 AAA 클래스를 상속하고 있고, DDD 클래스는 BBB 클래스와 CCC 클래스를 다중 상속하고 있다.
아래 그림 처럼 다중 상속이 다이야몬드 형태로 구조가 나타날때도 모호성이 발생한다.
![](https://t1.daumcdn.net/cfile/tistory/24401B38568017421E)
BBB 클래스와 CCC 클래스 둘다 AAA 클래스를 상속하였기 때문에 이 둘을 다중 상속하게되면 AAA 클래스를 중복으로 상속하게 되는 것이다. 때문에, AAA 클래스의 멤버 함수를 두 개 지니게 되고, 모호성이 발생하여 에러가 발생하게 된다.
이는, AAA 클래스가 DDD 클래스에 한번만 상속되도록 하는 virtual 상속을 사용하여 해결할 수 있다.
1 | class BBB : virtual public AAA |
|
1 | class CCC : virtual public AAA |
|
이렇게 BBB 클래스와 CCC 클래스에서 virtual 상속을 하게되면 이 두 클래스를 다중상속 하더라도 AAA 클래스 안에 존재하는 멤버들은 한번만 상속이 이루어 진다.
이처럼 다중상속의 문제점을 해결할 수는 있지만, 어쨋든 다중 상속을 사용하면 클래스들 간에 관계가 복잡해지므로 사용하지 않는 것이 좋다.