는 하나의 템플릿 클래스를 작성하고 당신이 시간에해야하는 지금의 인스턴스, 또는 템플릿 클래스의 형식 정의 B와 C 가상 함수는 동일한 시그너처를 가져야합니다 (예외가있을 수 있지만 이는 해당 케이스와 관련이 없습니다). 그래서 해결책은 모든 경우를 해결할 논증입니다. 단지 특정 하나의 함수에
패스의 모든 변종 및 사용 :이 변종은
class A {
public:
virtual void set(int, double) = 0;
};
class B {
int y;
public:
virtual void set(int val, double) { y = val; }
};
class C {
double y;
public:
virtual void set(int , double val) { y = val; }
};
이 아주 좋은 해결책이 아니다 및 확장 성이 좋지 않기 때문에 우리가 노동 조합 사용할 수 있습니다
Union Arg {
int i;
double d;
};
class A {
public:
virtual void set(Arg a) = 0;
};
// derived classes are trivial, so omitted
을
연합 (EU)은 안전 입력하지, 그래서 우리는 매개 변수에 다른 계층 구조를 가지고 부스트 :: 대신
변형 다른 방법을 사용할 수 있습니다
struct Arg {
virtual ~Arg();
};
struct IntArg : Arg {
int m_value;
};
struct DoubleArg : Arg {
double m_value;
};
class A {
virtual void set(const Arg &a) = 0;
};
class B {
int y;
public:
virtual void set(const Arg &a) { y = dynamic_cast<const IntArg &>(a).m_value; }
};
class C {
double y;
public:
virtual void set(const Arg &a) { y = dynamic_cast<const DoubleArg &>(a).m_value; }
};
static_cast를 사용할 수 있으며 Arg에서 가상 소멸자가 필요하지 않지만 덜 안전합니다.
이들은 매우 다양 할 수 있습니다. 어떤 프로그램이 가장 적합한 프로그램인지는 프로그램 요구 사항에 따라 결정할 수 있습니다.
상속없이 두 개의 별도 클래스를 만드시겠습니까? – juanchopanza
은 상속됩니다. 두 개의 칼시는 B와 C이다. – YkI
상속보다이 템플릿을 사용하는 것이 더 적합 할 것입니다. – Chad