본문 바로가기

Coding Note

[C++] virtual inheritance

c++은 다중상속이 가능한데, 다중상속을 허용했을 때 다이아몬드 상속이 문제될 수 있다.

 

class A;

 

class B : public A;

class C : public B;

 

class D : public B, public C;

 

 

와 같은 다이아몬드 형태일 때 클래스 D의 입장에서는 A의 메모리에 어떻게 접근해야 하는지 모호해진다.

실제로 A의 멤버에 대한 메모리는 B와 C에 대한 생성자가 호출될 때 반복해서 적재된다.

 

 

이런 경우에 A클래스를 가상상속하여 해결할 수 있다.

 

class A;

 

class B : virtual public A;

class C : virtual public A;

 

class D : public B, public C;

 

 

이렇게 되면 클래스 D에서 A의 멤버를 'A::멤버'  의 형태로 접근할 수 있으며 메모리 중복으로 인한 문제도 해결된다.

 

 

 

하지만,,  아무리 해결책이 있다고 해도 단일상속, 다중 인터페이스 구조를 따르는게 가장 좋다. 구조적으로도 그렇고 구조의 해석에 있어서도 깔끔하다. 아주 가끔 다중상속을 정말 하고싶을때가 있다. 인터페이스만을 제공하면 멤버변수에 대한 통일성을 제공할 수 없기때문인데 그런 경우에만 조심해서 사용하도록 해야겠다.

 

(가상상속이 야기할 수 있는 다른 문제는 아직 잘 모르겠다. irrlicht 엔진을 분석하는 도중에 IReferenceCounted 클래스와 Device클래스, Driver클래스의 상속구조가 가상상속을 하고있어 찾아봤다.)

'Coding Note' 카테고리의 다른 글

A point within the tetrahedron  (0) 2013.10.23
matrix determinant  (0) 2013.10.23
[Design pattern] 디자인 패턴이란  (6) 2013.03.28
[Design pattern] Visitor  (0) 2013.03.27
[Design pattern] Template method  (0) 2013.03.27