2016-06-21 5 views
0

나는 보통 뭔가를 게시하기 전에 여기에서 답을 찾으려고 노력하지만 내 질문을 공식화하는 방법조차 모르겠습니다.인터페이스와 구현 모두에서 상속 C++

그래서 여기에 내가하고 싶은 것이 있습니다 ... 기본 인터페이스와 파생 인터페이스를 정의하고 싶습니다. 그런 다음, 추가 변수와 메소드를 사용하여 기본 인터페이스를 구현하려고합니다. 마지막으로 구현 된 기본 인터페이스에서 파생 클래스를 구현하고 파생 인터페이스에서 구현하고 싶습니다. 나는 너를 모른다.하지만 머리가 아프다.

아래와 같이 할 경우 DerivedFloat 코드에서 모호한 정의를 얻습니다. 그 이유는 해당 코드가 IBase의 GetBaseValue 메서드와 IDerivedFloat를 통해 상속 된 GetBaseValue 메서드와 Base에서 상속 된 GetBaseValue를 모두 보았기 때문입니다.

분명히 기본 구현의 확장 된 기능을 사용하는 클래스를 파생시킬뿐만 아니라 필요한 IDerivedFloat 메소드를 구현하는지 확인해야합니다.

Now ... 이것은 내가 개념적으로 달성하고자하는 것을 보여주는 가짜 예제입니다. 실생활의 예가 아닙니다.

template <typename VALUE_TYPE> 
class IBase 
{ 
public: 
    virtual VALUE_TYPE GetBaseValue() const = 0; 
}; 

class IDerivedFloat : public IBase<FLOAT> 
{ 
public: 
    virtual void SetBaseValue(const FLOAT & value) = 0; 
}; 

// Implementation of Base 
template <typename VALUE_TYPE> 
class Base : public IBase<VALUE_TYPE> 
{ 
public: 
    VALUE_TYPE GetBaseValue() const { return m_BaseValue; } 

protected: 
    VALUE_TYPE m_BaseValue; 
} 

// Uses expanded Base AND implements IDerivedFloat 
class DerivedFloat : public Base<FLOAT>, public IDerivedFloat 
{ 
public: 
    void SetBaseValue(const FLOAT & value) { m_BaseValue = value }; 
} 
+0

* 나는 보통 아무것도 대답을 게시하기 전에 여기에서 답을 찾으려고 노력합니다. - 따라서 "다이아몬드 상속"또는 [가상 상속]을 찾지 못했습니다 (http://stackoverflow.com/questions/21558/in-c- 가상의 기본 클래스)를 검색 할 때 사용합니까? – PaulMcKenzie

+0

C++ 전문가가 아닙니다. 처음에는 다이아몬드 상속에 대해 들어 봤습니다. "가상 상속"에 관한 한, 나는 가지고 있습니다. 그러나 분명히, 귀하의 의견에서, 나는 내 문제를 해결하기 위해 어떻게 정보를 알지 못합니다. – ThermoX

+0

내 코멘트에 링크를 클릭하셨습니까? 그것은 기본적으로 당신이 받아들이는 대답의 사본입니다. – PaulMcKenzie

답변

3
당신은이 문제를 해결하려면 virtual inheritance을 사용할 수 있습니다

: 가상 상속을 사용

class IDerivedFloat : virtual IBase<FLOAT> 
{ 
public: 
    virtual void SetBaseValue(const FLOAT & value) = 0; 
}; 

template <typename VALUE_TYPE> 
class Base : virtual IBase<VALUE_TYPE> 
{ 
public: 
    VALUE_TYPE GetBaseValue() const { return m_BaseValue; } 

protected: 
    VALUE_TYPE m_BaseValue; 
} 

기본 클래스 멤버의 파생 클래스 인스턴스를 제공하는 대신 클래스 계층 구조에있을 때마다 하나씩

+0

감사합니다. Andy! 그게 내가하고 싶었던 것처럼 보이고 ... 그리고 당신의 대답은 "허, 가상 상속을 들여다 보지 마시오"보다 조금 더 유익합니다 :) – ThermoX

0

다중 상속은 정확히 모호성 문제로 인해 발생하지만 문제를 해결할 수있는 방법이 있습니다. 수퍼 이름과 이중 콜론을 사용하여 함수 호출을 유도하여 모호한 함수를 호출하는 수퍼 클래스를 컴파일러에 명시 적으로 알려야합니다.

예 :
- C는 A와 B
상속 - A 및 B는 모두() 함수를 추가 할 수 있습니다.
- C에서는 컴파일러에게 사용할 A :: add() 또는 B :: add()를 사용해야합니다. 자세한 내용과보다 완벽한 구현을위한

링크 : http://www.cprogramming.com/tutorial/multiple_inheritance.html

+0

감사합니다. 나는 실제로 그것을 시도했다! 하지만 저를 괴롭힌 것은 파생 된 클래스가 두 정의를 모두 담고 있다는 것입니다 ... 나는 피하려고 노력했습니다. 이것은 제가 올바른 방법으로 문제에 접근하지 못하고 있다고 결론을 이끌고 있습니까? – ThermoX

+0

두 가지 기능을 모두 사용하지 않으려 고한다면 아이에게 또 다른 기능을 사용하여 무시할 수 있습니다. 그러나 부모 기능을 제거하지는 않습니다. 그들은 여전히 ​​접근 할 수 있습니다. 클래스의 일부만 상속받을 수 있는지 확신 할 수 없으며 모든 것을 상속해야합니다. – Kadima

+0

위의 Andy가 답변을 제공했습니다. 도와 주신 카디마에게 다시 한번 감사드립니다. – ThermoX

관련 문제