다중 상속이란 하나의 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 클래스를 다중 상속하고 있다.
아래 그림 처럼 다중 상속이 다이야몬드 형태로 구조가 나타날때도 모호성이 발생한다.
BBB 클래스와 CCC 클래스 둘다 AAA 클래스를 상속하였기 때문에 이 둘을 다중 상속하게되면 AAA 클래스를 중복으로 상속하게 되는 것이다. 때문에, AAA 클래스의 멤버 함수를 두 개 지니게 되고, 모호성이 발생하여 에러가 발생하게 된다.
이는, AAA 클래스가 DDD 클래스에 한번만 상속되도록 하는 virtual 상속을 사용하여 해결할 수 있다.
1 | class BBB : virtual public AAA |
|
1 | class CCC : virtual public AAA |
|
이렇게 BBB 클래스와 CCC 클래스에서 virtual 상속을 하게되면 이 두 클래스를 다중상속 하더라도 AAA 클래스 안에 존재하는 멤버들은 한번만 상속이 이루어 진다.
이처럼 다중상속의 문제점을 해결할 수는 있지만, 어쨋든 다중 상속을 사용하면 클래스들 간에 관계가 복잡해지므로 사용하지 않는 것이 좋다.