를 인스턴스화 할 수 있습니까? 이것이 여기서 핵심적인 문제입니다.
그렇지 않은 경우 비 전문화 된 메소드에 대해 다른 클래스를 작성하고 CTemplateInherit
클래스의 두 클래스에서 (공개적으로) 상속 할 수 있습니다. 문제 해결됨.
그러나, 비 전문적인 방법이 TBase 클래스의 가상 메소드를 오버라이드 (override)하는 경우는, 다음은 약간 더 복잡하다 :
이
솔루션은 1) 모든 비 - 전문 기능을 가지고 하나로 재 그룹 "세부 사항 " 머리글. 템플릿이 아닌 (템플릿이 아닌) 자유 함수 그룹 (입출력을 매개 변수로 전달하기가 쉬운 경우) 또는 필요하지 않은 특수 데이터 멤버를 사용하여 (비 템플릿) 클래스로 제공됩니다. 그런 다음, 해당 cpp 파일 (나중에 DLL로 컴파일)에서 모든 함수를 정의 (구현)합니다.
그런 다음 CTemplateInherit
클래스 템플릿에서 비 특수 함수 호출을 "detail"함수 세트로 전달하면됩니다. 템플릿은 기본적으로 인라인이므로 오버 헤드는 없습니다. "세부 사항"기능을 하나의 클래스 (템플릿이 아님)로 재 그룹화해야한다면 private
계승을 사용하여 함수 이름 충돌을 방지하십시오. 그런 다음 다른 상속 된 데이터 멤버와 마찬가지로 "detail"클래스의 데이터 멤버에 액세스 할 수 있으며 특수한 함수 호출을 DLL로 컴파일 할 수있는 "detail"클래스 구현에 전달할 수 있습니다. DLL에서 클래스를 내보내는 데 적합한 프레임 워크 (일반 C++에는 신뢰할 수있는 메커니즘이 없기 때문에)하지만 사용자의 질문은 암시적인 것 같습니다.
이 솔루션의 유일한 문제는 몇 가지 간단한 전달 기능을 성가신 것으로 만듭니다. 하지만 IMHO는 DLL에서 구현을 제거하는 데 드는 비용으로 합리적인 가격입니다 (거의 언제든지 원하는대로 래퍼 함수를 작성해야합니다).
해결 방법 2) 기본 클래스에서 특수화되지 않은 가상 함수 세트가있는 경우 해당 하위 세트는 실제로 TBase
의 실제 유형에 종속되지 않습니다. (즉, 해당 함수의 프로토 타입은 해당 클래스없이 프로토 타입을 만들 수 있습니다.). 그러면 해당 하위 집합을 TBase
에서 상속받을 것으로 예상되는 다른 기본 클래스로 다시 그룹화 할 수 있습니다. TNonSpecialBase
이라고합시다. 이 시점에서, 당신은 다음과 같은 계층 구조를 설정할 수 있습니다
class TNonSpecialBase {
// set of pure-virtual functions that are not special.
};
// this is an example of a class that could act as a TBase:
class TExampleBase : public virtual TNonSpecialBase {
// set of virtual functions that are special to TExampleBase.
};
class CNonSpecialDerived : public virtual TNonSpecialBase {
// declaration of non-specialized functions that override the function in TNonSpecialBase.
};
template <typename TBase>
class CTemplateInherit : public TBase, public CNonSpecialDerived {
// set of virtual functions that are specialized for the template argument TBase.
};
위의 설치와를 전문 기능 CTemplateInherit
의 헤더 파일에서 생을 마감해야하지만 비 전문 기능을 정의 할 수 있습니다 CNonSpecialDerived
에서 전열을 정비 별도의 cpp 파일에서 (그리고 DLL로 컴파일 된). 마술 트릭은 가상 클래스를 사용하여 최종 클래스가 기본 클래스 TNonSpecialBase
에 대한 단일 가상 테이블을 가질 수있게합니다. 다시 말해, CNonSpecialDerived
클래스는 TNonSpecialBase
에서 상속 된 TBase의 가상 함수를 무시할 수 있습니다. 단, TBase가 해당 함수를 무시하지 않는 한 컴파일러에서 모호함이라고합니다. 이 방법으로 사용자는 TBase
개체에 대한 포인터를 처리 할 수 있으며 가상 함수를 호출하여 CTemplateInherit
구현 (특수화) 또는 CNonSpecialDerived
구현 (아마도 DLL)으로 전달할 수 있습니다.
템플릿 매개 변수없이 'CTemplateInherit :: DoNonSpecializedWork'가 컴파일되지 않아야합니다. 맞습니까? – Vlad
모든 비 특화된 메소드를 구현하고, template class CTemplateInherit : public TBase, public TNonspecialized'를 선언하는 중간의 비 템플릿 화 된'TNonspecialized'를 생성 할 수 있습니까? –
Vlad
감사합니다! 아니요, 물론 컴파일되지 않습니다. 그것은 내가하고 싶었던 것과 더 비슷했습니다. 두 클래스에서 상속을 생각하고 있었지만 하나의 멤버 함수에 대한 함수 호출은 모호합니다. 비록 당신이 제안한 것처럼 나는 그 라인을 따라 뭔가를하려고 여전히 생각하고 있지만. – namezero