다중상속이란, 둘 이상의 클래스를 동시에 상속하는 것을 말한다. 하지만 제법 논란이 되는 문법이다.
다중상속에 대한 프로그래머들의 첫 번째 의견은 다음과 같다.
“다중상속은 득보다 실이 더 많은 문법이다. 그러니 절대로 사용하지 말아야 하며, 가능하다면 C++의 기본문법에서 제외시켜야 한다.”
다음은 이보다 조금 부드러운 의견이다.
“일반적인 경우에서 다중상속은 다양한 문제를 동반한다. 따라서 가급적 사용하지 않아야 함에는 동의를 한다. 그러나 예외적으로 매우 제한적인 사용까지 부정할 필요는 없다고 본다.
class MultiDerived : public BaseOne, protected BaseTwo
{
public:
void ComplexFunc()
{
...
}
}
int main(void)
{
}
다중상속의 대상이 되는 두 기초 클래스에 동일한 이름의 멤버가 존재하는 경우에는 문제가 발생할 수 있다. 이러한 경우에는 유도 클래스 내에서 멤버의 이름만으로 접근이 불가능하기 때문이다.
“도대체 어느 클래스에 선언된 멤버에 접근을 하라는 거야?”
함수 호출관계의 모호함은 다른 상황에서도 발생할 수 있다.
class MiddleDerivedOne : virtual public Base
{
public:
MiddleDerivedOne() : Base()
{
}
}
Base
MiddleDerivedOne. MiddleDerivedTwo
LastDerived
위 예제에서 보이는 상속의 구조는 다음과 같다. 여기서 중요한 것은 LastDerived클래스가 Base 클래스를 간접적으로 두 번 상속한다는 점이다.
떄문에 virtual 선언이 되지 않은 상태에서 객체가 생성되면 다음의 그림의 형태가 된다. 따라서 이 경우에는 다음과 같이, 어크 클래스를 통해서 간접 상속한 Base 클래스의 멤버함수를 호출할 것인지 명시해야 한다.
그런데 이러한 상황에서, Base클래스의 멤버가 LastDerived 객체에 하나씩만 존재하는 것이 타당한 경우가 대부분이다. 그리고 이를 위한 문법이 바로 ‘가상 상속’이다.
이를 통해 SimpleFunc 함수를 이름만 가지고 호출할 수 있는 것이다. 그리고 예제의 실행결과를 보면 실제로 Base클래스의 생성자가 한번만 호출되는 것을 확인할 수 있다. 만약에 가상상속을 하지 않는다면, Base 클래스의 생성자는 두번 호출된다.