2016-07-09 6 views
0

예를 들어, 추상 기본 클래스 AB이 있습니다. B위한 따라서 클래스 A1 들어2 개의 접힌 다형성이 이상합니다. 어떻게 확장 할 수 있습니까?

class A 
{ 
public: 
    virutal void f(B& b) = 0; 
}; 

class A1 : public A 
{ 
public: 
    void f(B& b) override { b.f(A1); } 
}; 

및 다음 A

class B 
{ 
public: 
    virtual void f(A1& a) = 0; 
}; 

그리고 class B1 : public Bf(A1)는 가상 메소드는 가상 메소드를 필요 가상 메소드를 갖는다 구현. 문제는 또 다른 class A2 : public A을 추가 할 때 B 클래스에 가상 메서드 virtual void f(A2& a) = 0을 추가해야한다는 것입니다.이 코드는 인지 알 수 없기 때문에 코드를 깨뜨린 것 같아요. A1도 추가되었거나 클래스를 디자인 할 때 B을 디자인 할 때 발생합니다. 그것을 피하는 방법 그러나 동등한 요구 사항을 구현하는 방법? 모든 C++ 기능은 템플릿에서도 사용할 수 있습니다.

+0

정말 달성하기를 원하십니까? –

답변

1

불행히도, C++의 가상 템플릿 함수와 같은 것은 없습니다. (질문을 파싱 한 후 성취하려는 것입니다.)

가장 가까운, 그리고 내가 생각할 수있는 가장 추한 솔루션은 B 매개 변수로 기본 클래스 A을 기본 클래스의 가상 함수를 가지고있다 :

class B 
{ 
public: 
    virtual void f(A& a) = 0; 
}; 

B1 재정의를 그 다음 사용 dynamic_cast 매개 변수를 A1의 인스턴스로 전송합니다.

이렇게하면 기본 클래스에서 API 인터페이스를 변경하지 않고 각 AxBx 파생 클래스 쌍을 두 계층 구조간에 계속 정의 할 수 있습니다.

약간 못 생겼지 만 "모든 C++ 기능을 사용할 수있다"는 문구가 있으며 해당 요구 사항에 따라 dynamic_cast이 적합합니다.