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 클래스의 객체 상태는 다음과 같다.
이를 방지하기 위해선 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 클래스의 객체 상태는 다음과 같다.
다이아몬드 상속은 절대 사용해서는 안된다.