하나의 클래스가 복수의 클래스를 상속받는 것이 가능하다. 이를 다중 상속이라고 한다.
다중 상속은 다음과 같이 선언된다.

 
class Parent1
{ /* 생략 */ };
 
class Parent2
{ /* 생략 */ };
 
class child : public Parent1, protected Parent2
{ /* 생략 */ };
 
 

그러나 다중 상속은 대부분의 경우 아예 사용되지 않거나, 특수한 상황에서만 매우 제한적으로 사용된다 ( 이러한 경우에도 다중 상속을 사용하지 않고 처리할 수 있다. 다중 상속을 사용해야만 하는 케이스는 없다. ).

다중 상속이 잘 사용되지 않는 이유는 아래와 같은 단점, 모호함들을 가졌기 때문이다.

  1. 부모 클래스 1과 2가 서로 같은 함수명, 매개변수를 가진 함수를 보유한 경우, 컴파일러가 어느 함수를 호출해야 할지 알 수 없어 에러가 발생한다.
    아래와 같은 형식으로 어느 클래스의 함수인지 명시하여 해결할 수 있다.
    Parent1::Func(); Parent2::Func(); //부모클래스명::함수명()

  2. 아래와 같이 하나의 클래스가 간접적으로 같은 클래스를 2번 상속받을 수 있다.

    1. Parent 클래스를 선언한다.
    2. Child1, Child2 클래스를 선언한다. 이 클래스들은 모두 Parent를 상속받는다.
    3. GrandChild 클래스를 선언한다. 이 클래스는 Child1, Child2 클래스들을 다중 상속한다.
    4. 결과적으로 GrandChild 클래스는 간접적으로 Parent 함수를 2번 상속 받는다.
    • GrandChild 함수는 결과적으로 Parent 클래스의 생성자도 2번, 소멸자도 2번 호출되며, 멤버 변수도 복제되어 2배로 상속받는다. 대부분의 경우에서 이는 의도되지 않은 현상이며, 코드의 직관성을 해친다는 문제가 있다.
      가상 상속을 사용하여 이러한 문제를 해결할 수 있다.

참고자료

윤성우의_열혈_cpp_프로그래밍