[C++] 다이아몬드 상속과 다중상속

Diamond Inheritance

다중상속을 지원하는 C++에서는 다이아몬드 상속 문제가 생길 수 있다. 다음 코드를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
public:
void func() {
cout<<"This is A Function"<<endl;
}
};

class B : public A {};
class C : public A {};
class D : public B, C {};

int main(int argc, char** argv){
D* d = new D();
d->func();
}

위 코드는 문제가 있는 코드이다. A클래스를 두번 상속하기 때문에 어떤 클래스의 func()를 호출할지에 대해 모호성이 생기기 때문이다. 위 코드에 대한 D 클래스의 객체 상태는 다음과 같다.

Diamond Inheritance

이를 방지하기 위해선 virtual 상속을 해야한다. 코드는 다음과 같다. virtual 상속을 통해 A 클래스의 객체가 서브클래스 모두에 생성되는 것을 방지 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
public:
void func() {
cout<<"This is A Function"<<endl;
}
};

class B : virtual public A {};
class C : virtual public A {};
class D : public B, C {};

int main(int argc, char** argv){
D* d = new D();
d->func();
}

위 코드에 대한 D 클래스의 객체 상태는 다음과 같다.

Diamond Inheritance

다이아몬드 상속은 절대 사용해서는 안된다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/18/Languages/Cplusplus/diamondInheritance/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.