2012-04-14 5 views
0

저는 C++에서 다중 가상/비 가상 상속의 개념을 파악하려고 애 쓰고 있습니다. 클래스 B와 C가 클래스 A로부터 사실상 상속 받았다면 올바르게 이해한다면, 그들은 하나의 공통 객체 A의 동일한 필드에 액세스하는 것과 같은 일종의 싱글 톤 객체를 공유합니다. 다중 상속은 B 및 C 객체에 대해 별도의 A 객체를 만듭니다.C + +에서 가상 대 비 가상 다중 상속

위의 사항을 고려하면 누구나 친절하고 간단하고 실용적인 맥락에서 제시 할 수 있습니까? 왜 처음에는 다중 상속을 받았으며 왜 가상/가상이 아닌가?

감사합니다.

+0

C++ 프로그래밍에 대해 읽은 내용이 있습니까? 다중 상속이나 가상 상속은 까다 롭고 매우 자주 피해야합니다. 그리고 문제는 B와 C 모두로부터 계승 된 D 클래스입니다. –

+0

글쎄, 지금은 공부하고 있는데, 기본적인 소개 만했습니다. 누군가가 왜 다른 것을 사용하는지 간단한 예제를 줄 수 있다면 나는 더 나을 것이 분명합니다. 복잡한/경계선의 경우는 필요 없습니다. 한 가지 문장만으로도 기본적인 시나리오가 완벽 할 것입니다. – Bober02

+0

저는 상속이나 가상 상속을 여러 개 사용할 필요가 거의 없습니다. 좋은 규칙은 절대 사용하지 않는 것입니다. –

답변

4

다중 상속은 종종 used in C++이 아닙니다. 대부분의 경우 인터페이스/구현이 혼합되어 있습니다. 그것은 금지되어 있지도 않습니다. (가상) 다중 상속에 대한 필요성은 하나 개의 일반적인 기본 클래스에서 파생하는 디자인 결정에서 온다 :

class Window 
{ /* draw, show, hide, background ... */ }; 

class WindowWithBorder : public virtual Window 
{ /* methods to manipulate/draw border ... */ }; 

class WindowWithMenu : public virtual Window 
{ /* methods to manipulate/draw Menu ... */ }; 

class MyWindow : public WindowWithBorder, public WindowWithMenu 
{ /* now it's your turn ... */ }; 

그 다이아몬드 모양의 상속 그래프는 라이브러리 구현 예견해야합니다. virtual이 없으면 두 개의 기본 Window 개체가 있고 virtual은 하나뿐입니다. 단 하나의 개체가 아니기 때문에 많은 창이있을 수 있습니다.

라이브러리는 종종 이러한 상황 (예 : 모든 경우가 아님)을 나타낼 수 있습니다. 을 구현하거나, "뚱뚱한"기본 클래스를 가지거나, 추상 인터페이스 클래스를 구현하거나, 특성/정책이있는 템플릿을 사용하여 구현할 수 있습니다.

Bjarne Stroustrup의 The C++ Programming language (제 3 판의 15 장, 예를 빌렸습니다)의 클래스 계층 구조에 대한 장을 읽는 것이 좋습니다.