하나의 클래스가 복수의 클래스를 상속받는 것이 가능하다. 이를 다중 상속이라고 한다.
다중 상속은 다음과 같이 선언된다.
class Parent1
{ /* 생략 */ };
class Parent2
{ /* 생략 */ };
class child : public Parent1, protected Parent2
{ /* 생략 */ };
그러나 다중 상속은 대부분의 경우 아예 사용되지 않거나, 특수한 상황에서만 매우 제한적으로 사용된다 ( 이러한 경우에도 다중 상속을 사용하지 않고 처리할 수 있다. 다중 상속을 사용해야만 하는 케이스는 없다. ).
다중 상속이 잘 사용되지 않는 이유는 아래와 같은 단점, 모호함들을 가졌기 때문이다.
-
부모 클래스 1과 2가 서로 같은 함수명, 매개변수를 가진 함수를 보유한 경우, 컴파일러가 어느 함수를 호출해야 할지 알 수 없어 에러가 발생한다.
→ 아래와 같은 형식으로 어느 클래스의 함수인지 명시하여 해결할 수 있다.
Parent1::Func(); Parent2::Func(); //부모클래스명::함수명() -
아래와 같이 하나의 클래스가 간접적으로 같은 클래스를 2번 상속받을 수 있다.
- Parent 클래스를 선언한다.
- Child1, Child2 클래스를 선언한다. 이 클래스들은 모두 Parent를 상속받는다.
- GrandChild 클래스를 선언한다. 이 클래스는 Child1, Child2 클래스들을 다중 상속한다.
- 결과적으로 GrandChild 클래스는 간접적으로 Parent 함수를 2번 상속 받는다.
- GrandChild 함수는 결과적으로 Parent 클래스의 생성자도 2번, 소멸자도 2번 호출되며, 멤버 변수도 복제되어 2배로 상속받는다. 대부분의 경우에서 이는 의도되지 않은 현상이며, 코드의 직관성을 해친다는 문제가 있다.
→ 가상 상속을 사용하여 이러한 문제를 해결할 수 있다.
참고자료