이의 우리가 같은 컬렉션 클래스가 있다고 가정하자 B는 추상 클래스와재정의 함수 매개 변수/
doSomethingWithAllObjects();
의 특정 행동이
class CCollection {
public:
void add(B& b);
void remove(B& b);
void doSomethingWithAllObjects();
protected:
std::vector<B*> bs;
}
가 B의 구체적인 유형에 따라 달라
, 전화를 그것은 C.CCollection을 유도하고 방법을 알려줄 수있는 방법이 있습니까
add(B b);
remove(B b);
파생 형식을 수락 하시겠습니까?
class D : A{
public:
void add(C c);
void remove(C c);
void doSomethingWithAllObjects();
private:
std::vector<B*> bs;
}
를하거나 유도 거의 100 %를 동일
template<class T : B>
class C {
...//do lots of stuff
}
같은 일반적인 javaish가 구성 :
는이 같은 방법을 재정의 같은 것을 생각했다. 그러나 당신은 B의 다른 파생어를 섞어서는 안됩니다.
나는 이미 템플릿 클래스를 특정 유형으로 제한하는 것이 불가능하지만 B의 모든 파생에 대해 전체 클래스를 작성하는 것을 피할 수있는 방법이 있어야합니다. 요점은, 나는 B에 정의 된 기능이 필요합니다, 그래서 난 그냥 바로 CCollection에 대한 권리 유형을 넘겨 내가 다른 프로그래머를 가정 할 수 물론 간단한 템플릿
template<class T>
class B{
....
}
을 사용할 수 있지만,이 정신이 될 수 없습니다. 내가 원한 것은 다른 프로그래머에게 단 하나의 유형의 Bs를 추가하도록 강제하는 것입니다. 당신이 C
이 B
의 서브 클래스가 아닌 경우 Collection<C>
를 인스턴스화하려고하면
스택 오버플로에 오신 것을 환영합니다! 내가 당신의 질문을 올바르게 읽는다면 근본적인 디자인 문제가있는 것 같다. 'virtual' 함수는 * runtime *에서 행동을 결정할 수있게합니다. 그리고 그 매개 변수의 유형을 변경하는 것은 런타임 조건이 알려지기 전에 컴파일 타임에 적용되는 것입니다. 컴파일시에 무엇을 시행하기를 희망하십니까? –
파생 된 형식을 수락 하시겠습니까? 기본 클래스 추상 클래스가 아닌가? 당신은 그것의 객체를 선언 할 수 없습니다. 어떻게 추가하고 제거 할 수 있습니까? 내가 여기서 뭔가를 놓치고 있니? – stardust
값 매개 변수'add (B b)'를 벡터'std :: vector '에 저장하는 포인터로 변환하는 방법을 모르겠다면 취할 수있는 유일한 주소는 함수의 끝 'add()' –