필자는 현재 가상 프로젝트 (인터페이스)를 사용하여 현재 프로젝트의 여러 클래스 구현 간의 종속성을 줄입니다. 순수한 가상 클래스와 비 순수 가상 클래스가 다른 순수 가상 클래스를 확장하는 계층 구조를 갖는 것도 드문 일이 아닙니다. 다음은 이러한 상황의 예는 다음과 같습니다순수 가상 (인터페이스) 클래스를 가상 상속하는 것이 좋은 방법입니까?
class Engine
{ /* Declares pure virtual methods only */ }
class RunnableEngine : public virtual Engine
{ /* Defines some of the methods declared in Engine */ }
class RenderingEngine : public virtual Engine
{ /* Declares additional pure virtual methods only */ }
class SimpleOpenGLRenderingEngine : public RunnableEngine,
public virtual RenderingEngine
{ /* Defines the methods declared in Engine and RenderingEngine (that are not
already taken care of by RunnableEngine) */ }
모두 RunnableEngine
및 RenderingEngine
사실상 다이아몬드 문제가 SimpleOpenGLRenderingEngine
에 영향을 미치지 않도록 Engine
을 확장합니다.
나는 문제가 될 때 다이아몬드 문제를 예방하는 입장을 취하고 싶습니다. 특히 다른 사람이 사용하기 쉬운 코드를 쓰고 싶습니다. 원하지 않습니다. 특정 클래스 계층을 생성 할 수 있도록 클래스를 수정해야합니다. 밥이 작업을 수행하기를 원한다면 : 나는 SimpleOpenGLRenderingEngine
사실상 RenderingEngine
을 확장하게하지 않았다면
class BobsRenderingEngine : public virtual RenderingEngine
{ /* Declares additional pure virtual methods only */ }
class BobsOpenGLRenderingEngine : public SimpleOpenGLRenderingEngine,
public BobsRenderingEngine
{ /* Defines the methods declared in BobsRenderingEngine */ }
이 가능하지 않을 것입니다. 나는 Bob이 이것을 원할 확률이 매우 낮을 수 있음을 알고 있습니다.
그렇기 때문에 순수 가상 클래스를 사실상 확장하여 규칙 상 다중 상속으로 인해 다이아몬드 문제가 발생하지 않도록하기 시작했습니다. 어쩌면 이것은 Java에서 왔고 순수하지 않은 가상 클래스로 단일 상속만을 사용하려는 경향이 있기 때문일 수 있습니다. 어떤 상황에서는 과잉이라고 나는 확신하지만,이 대회를 사용하는 데있어서 단점이 있습니까? 이로 인해 성능/기능 등의 문제가 발생할 수 있습니까? 그렇지 않다면, 종종 마지막에 필요하지 않을지라도, 대회를 사용하지 않을 이유는 없습니다.
그래, 완전한 과용. 선택할 수있는 여러 가지 구현 *이있을 때만 실제 다이아몬드 문제입니다. 인터페이스의 문제는 아니지만 구현이 없습니다. 가상 상속은 반창고이며, 등을 벽에 대어 사용할 때만 사용합니다. –
@HansPassant, 나는 당신에게 동의하지 않습니다. 다이 몬드 문제는 순수 가상 클래스에서도 종종 발생할 수 있습니다. IA와 그 기본 구현 인'AImpl : public virtual IA'라는 인터페이스가 있다고 가정하면 가상 상속을 사용하여'class B : public virtual IA, public AImpl'을 정의 할 수 있습니다. 따라서 B는 AImpl의 IA 구현을 사용합니다. –
@kids_fok 그래, 그게 내가 문제가있는 곳이야. 자, 예제에서 명시 적으로'IA '를 확장하기 위해'B'가 필요하지는 않습니다. 제 질문의 예제는 비슷합니다. –